前言:本文记录STM32f407程序移植到GD32F407的全过程,两个芯片是pin to pin,基本特性都是,最大168MHZ,1024k flash,192K sram,LQFP100封装。
1、安装keil对gd32f407的支持包
GigaDevice.GD32F4xx_DFP.2.0.0.pack
2、对u8、u16、u32等数据类型的支持
在gd32f4xx.h中定义
3、时钟选择
根据电路设计,外部使用8M,通过PLL到168M因此在sys_gd32f4xx.c文件中选择宏定义:
(1)选择时钟倍频方式
代码语言:javascript复制#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)
(2)库函数中个别外设的计算中用到了HXTAL_VALUE这个宏,因此需要重新定义,这个宏的取值也是与所选用时钟有关系,这里使用外部8M即HXTAL_VALUE=8000000。
(3)外设时钟使能
使用voidrcu_periph_clock_enable(rcu_periph_enum periph)函数,这里要注意periph的取值每次只能是某一个外设,不能用或的方式,如下:
4、systick时钟
Systick属于cortex m内核的时钟,与stm32用法一样。需要注意系统时钟与最大延时。
5、GPIO外设
Gpio配置为输出与输入略有不同
例如配置某个gpio为输出:
gpio_mode_set(PORT_LED, GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP, PIN_LED);
gpio_output_options_set(PORT_LED,GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, PIN_LED);
gpio_bit_set(PORT_LED,PIN_LED);
多了一个gpio_output_options_set的函数,对于输入则不需要这个函数。
6、Timer
这里要主要timer所在的总线,总线不同最大时钟不同,要注意最大时钟。
7、USART、SPI、ADC外设
这些都是从0开始,例如USART0、SPI0、ADC0,对应stm32就USART1、SPI1、ADC1。用法与stm32f407类似。
8、Fsmc
在GD32中叫做EXMC,用法和stm32一样,但是GD32f407的exmc可以驱动sdram,功能上比stm32强大。
这里要注意,引脚复用线与stm32不同,需要查看手册设置为相应的复用线,具体可参见手册《GD32F407xx_Datasheet_Rev2.0.pdf 》61页。
9、flash
在GD32中叫做fmc,gd32f407扇区划分、编程方式和stm32f407一样。
总结,从STM32f407程序移植到GD32F407,只需要更改相应的驱动即可,应用层可以直接使用,GD32的库函数对应stm32是标准库。