一.前言
本文分享py32f403的开发环境搭建,最后实现一个时钟配置和MCO输出的实例。
软件代码已经开源见: https://github.com/qinyunti/py32f403-nes.git
代码持续更新中。
二.下载手册和SDK
开发环境基于MDK5.4 编译版本6,MDK的安装不再赘述。
从以下地址https://www.py32.org/mcu/PY32F403xx.html下载
驱动代码下载:git clone https://github.com/OpenPuya/PY32F4xx_Firmware
更新,包含LL库和HAL,github上的只有HAL库。
三.安装MDK支持包
Git下载的SDK包中
有PY32F4xx_Firmware\Pack\KEIL\Puya.PY32F4xx_DFP.1.0.0.pack,可以直接双击安装。
或者从MDK中在线安装。
四.创建工程
Project->New uVision Project...
选择目录,输入工程名保存
选择芯片型号
只选择core
File -> New...
Ctrl+S保存
保存为main.c
在Source Group1上点击右键,Add Existing Files to Group ‘Source Group 1’...添加文件
选择刚才添加的main.c, 点击Add,然后点击Close
main.c中添加内容
int main(void)
{
while(1);
}
从PY32F4xx_Firmware\Templates\PY32F403xx_Templates\MDK-ARM下复制startup_py32f403xx.s
从PY32F4xx_Firmware\Templates\PY32F403xx_Templates\Src下复制system_py32f403.c添加到自己的工程。
配置选项,右键点击Target 1-> Options for Target ‘Target 1’...
定义宏PY32F403xD
编译, 此时能编译无问题
配置仿真器,右键点击Target1->Option for Target ‘Target 1’...
选择仿真器,我这里是CMSIS-DAP
然后点击Settings,看到识别到了芯片
确认flash下载算法
如果没有则点击Add添加.
算法文件位于D:\Keil_v5\Packs\Puya\PY32F4xx_DFP\1.0.1\CMSIS\Flash
将上述文件复制到
D:\Keil_v5\ARM\Flash
此时点击ADD就可以看到上述算法
勾选使用微库,否则无法运行到main
点击红色d按钮,下载并进入仿真环境
此时可以仿真调试,说明一切就绪。
配置编码以显示中文
五.添加库
下载的固件库的PY32F4xx_Firmware\Drivers\PY32F403_HAL_Driver复制到自己的工程,并添加
点击Target右键,添加Group
选中Fn+F2改名为Driver
双击Driver,选中所有c和h文件,Add添加,然后Close
并添加头文件包含路径
从git下载的固件包PY32F4xx_Firmware\Templates\PY32F403xx_Templates\Inc下复制
py32f403_hal_conf.h到自己的工程,同样添加其所在路径到头文件包含路径。
配置生成HEX文件
添加中断处理文件
从PY32F4xx_Firmware\Templates\PY32F403xx_Templates\Src复制py32f403_it.c
从PY32F4xx_Firmware\Templates\PY32F403xx_Templates\Inc复制py32f403_it.h
添加到自己的工程。
删掉py32f403_it.c中的#include "main.h"改为#include "py32f4xx_hal.h"
Main.c中
int main(void)
{
HAL_Init();
while(1);
}
此时在SysTick_Handler中打断点可以看到systick中断ok。
六.时钟配置和测试
外部使用了一个16M晶体
根据实际值定义宏HSE_VALUE=16000000ul
我们使用其配置系统时钟为144MHz。
初始化代码如下,注意flash延迟设置,144MHz时要设置为6以上
static void clk_init(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSI48MState = RCC_HSI48M_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_HIGH;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, 6);
SystemCoreClockUpdate();
}
Mco输出配置
使用PA8的AF0
代码如下
static void clk_out(void)
{
/* PA8 AF0 MCO*/
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);
}
int main(void)
{
HAL_Init();
clk_init();
HAL_Init();
clk_out();
while(1);
}
测试波形如下
最高可输出144MHz
七.总结
以上分享了整个环境搭建过程,以及时钟的配置,MCO的输出。
1.如果MDK下载出现问题提示could not stop cortex-m device,先确认RST是否为低,不为低则可以短路BOOT0和3V3进入ISP模式,然后再下载程序,再断开BOOT0和3V3。
2.配置时钟为144MHz时注意设置FLASH延迟6以上。