一.前言

本文分享py32f403的开发环境搭建,最后实现一个时钟配置和MCO输出的实例。

软件代码已经开源见: https://github.com/qinyunti/py32f403-nes.git

代码持续更新中。

二.下载手册和SDK

开发环境基于MDK5.4 编译版本6,MDK的安装不再赘述。

从以下地址https://www.py32.org/mcu/PY32F403xx.html下载

234942vd9dyluz1zy255k8

驱动代码下载:git clone https://github.com/OpenPuya/PY32F4xx_Firmware

建议从以下地址下载https://www.puyasemi.com/download_path/%E5%BA%93%E5%87%BD%E6%95%B0%E4%B8%8E%E4%BE%8B%E7%A8%8B/MCU%20%E5%BE%AE%E5%A4%84%E7%90%86%E5%99%A8/PY32F403_Firmware_V1.4.1.rar

更新,包含LL库和HAL,github上的只有HAL库。

三.安装MDK支持包

Git下载的SDK包中

有PY32F4xx_Firmware\Pack\KEIL\Puya.PY32F4xx_DFP.1.0.0.pack,可以直接双击安装。

或者从MDK中在线安装。

234942go6lrzu41ur96zco

四.创建工程

Project->New uVision Project...

选择目录,输入工程名保存

234942qehh88faolaelhjz

选择芯片型号

234942ptww2pskrrvlznrs

只选择core

234942y6c6ul30tozz000n

File -> New...

Ctrl+S保存

保存为main.c

234942pninvgeyuiauuedj

在Source Group1上点击右键,Add Existing Files to Group ‘Source Group 1’...添加文件

234943q8l5torl5br8yblr

选择刚才添加的main.c, 点击Add,然后点击Close

234943n0kxyytyhxyytkk4

main.c中添加内容

int main(void)

{

        while(1);

}

234943hrwn2ltrmmmubs8t

从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’...

234943zdzkf3plmuouqpwr

定义宏PY32F403xD

234943fxhtxj49noxtvkq9

编译, 此时能编译无问题

234943q2yphcmmfi3zhm2c

配置仿真器,右键点击Target1->Option for Target ‘Target 1’...

234943vu5ffk9fdb15oqmo

选择仿真器,我这里是CMSIS-DAP

234943cv0ml6tptpyvp2vl

然后点击Settings,看到识别到了芯片

234943l4li44k4d5sijo4l

确认flash下载算法

234944zb3w00sxqv58vs1v

如果没有则点击Add添加.

算法文件位于D:\Keil_v5\Packs\Puya\PY32F4xx_DFP\1.0.1\CMSIS\Flash

234944misxx1sxdno3opjs

将上述文件复制到

D:\Keil_v5\ARM\Flash

此时点击ADD就可以看到上述算法

234944nar8ly2t5l9aotu0

勾选使用微库,否则无法运行到main

234944drau7sf0xs6u6s9i

点击红色d按钮,下载并进入仿真环境

234944icj5pca00u49ca96

此时可以仿真调试,说明一切就绪。

配置编码以显示中文

234944thb8z487868zw2b2

234944l9zn0mngik0ik9di

五.添加库

下载的固件库的PY32F4xx_Firmware\Drivers\PY32F403_HAL_Driver复制到自己的工程,并添加

点击Target右键,添加Group

234944u8wwybyaacytf0a8

选中Fn+F2改名为Driver

双击Driver,选中所有c和h文件,Add添加,然后Close

234944ev5uh565tfnecafu

并添加头文件包含路径

234945j3k5fv7h9pk6zf72

234945kbx4v92zzxb4nbgt

234945b2kasspedbo32134

从git下载的固件包PY32F4xx_Firmware\Templates\PY32F403xx_Templates\Inc下复制

py32f403_hal_conf.h到自己的工程,同样添加其所在路径到头文件包含路径。

配置生成HEX文件

234945uf1baxrx3rx3feuc

添加中断处理文件

从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晶体

234945ve16jvseq6u1okgb

根据实际值定义宏HSE_VALUE=16000000ul

234945f49ix4fu21hhv91z

我们使用其配置系统时钟为144MHz。

234946er6knogaqnxfzhll

初始化代码如下,注意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

234946sc5btxm2gn1jcgee

代码如下

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

234946izl3x1pp8j3qhinu

234946t335i5h7lyy5sh5y

七.总结

以上分享了整个环境搭建过程,以及时钟的配置,MCO的输出。

1.如果MDK下载出现问题提示could not stop cortex-m device,先确认RST是否为低,不为低则可以短路BOOT0和3V3进入ISP模式,然后再下载程序,再断开BOOT0和3V3。

2.配置时钟为144MHz时注意设置FLASH延迟6以上。