关于GD32与STM32的区别,提到最多的是:
1、 GD32的主频可以跑108MHz STM32的主频可以跑到72MHz
2、 GD32所用的FLASH不同于STM32
3、 都可以使用STM32的固件库来开发
在进行所有实验之前得先建立一个工程模板:
1、由于可以用STM32的固件库开发,那么直接使用STM32F107的固件库来建立工程。
2、由于FLASH不同,得添加GD32的FLASH算法
GD32F103xx IDE Config V1.2.rar
解压后将FLASH算法文件添加到MDK的安装目录
需要配置工程,添加算法后,根据FLASH的容量修改FLASH大小:
3、修改修改HSE_STARTUP_TIMEOUT
这段代码在STM32F10X.H的128行处
#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF) /*!< Time out for HSE start up */
网上很多地方提到这点,刚开始也产生了疑问,为啥这里需要修改,这里把时间改长难道是GD32的这一个地方不如STM32...
找到的一个比较合理的解释是物理起振时间基本上是一致的,只是 GD 认为读取更多的 CLK 进来会更可靠!这个没有更多原因,就是 A 认为 5个可靠,B 认为 10 个可靠。没什么影响 就是个数。
4、关于时钟配置
用过STM32固件库的都应该知道,在跳转到main函数之前,已经执行了一段函数初始化系统。其中就有根据我们的选择将主频设置好为。
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000 #else /* #define SYSCLK_FREQ_HSE HSE_VALUE */ /* #define SYSCLK_FREQ_24MHz 24000000 */ /* #define SYSCLK_FREQ_36MHz 36000000 */ /* #define SYSCLK_FREQ_48MHz 48000000 */ /* #define SYSCLK_FREQ_56MHz 56000000 */ #define SYSCLK_FREQ_72MHz 72000000 #endif
STM32F107时钟树:
可以看出两个时钟树,都是一个外部8M晶振,通过一个PLL,但是不同的是GD32可以最高108M,而STM32最高为72M,这是为啥呢.....
看到图中最关键的地方还是倍频的地方,翻看寄存器发现这个:
先看STM32F107的寄存器描述
再看GD32的
这样,我按照STM32配置72M的程序在GD32上跑也应该是没有问题的,至少不会出大问题。毕竟只是先建立一个模板,之后再好好研究如何配置成108M。
5、让LED闪烁,验证模板的正确性
void LedPinInit() { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE ); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_Init (GPIOC,&GPIO_InitStruct); } void LedPowerSelect(u8 type) { if(0x1 == type) { GPIO_SetBits (GPIOC,GPIO_Pin_0); } else { GPIO_ResetBits (GPIOC,GPIO_Pin_0); } }
#include "led.h" void delay_test() { u32 delay_val = 0x2255100; while(delay_val--); } int main() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LedPinInit(); while(1) { LedPowerSelect(1); delay_test(); LedPowerSelect(0); delay_test(); } }