问题:
使用GD32F105RBT6芯片。时钟配置使用__SYSTEM_CLOCK_108M_PLL_HXTAL,使用外部晶振作为时钟源,系统时钟使用PLL时钟源,最终的时钟源是CK_PLL,要求是108M。
CK_PLL = (CK_PREDIV0) * 27 = 108 MHz,
CK_PREDIV0 = (CK_HXTAL)/2 *10 /10 = 4 MHz
这儿的CK_HXTAL是外部晶振的时钟频率。
配置完时钟之后,我们的单片机的时钟频率是108M。
CK_AHB = CK_SYS = 108M
CK_APB2 = CK_AHB = 108M
CK_APB1 = CK_AHB /2 = 54M
串口使用usart0,设置波特率是115200,但是串口调试助手上使用115200波特率读取的数据乱码,改成38400才能读取成功。
解决方案:
更改上述问题中我们配置的CK_HXTAL的值。因为GD系列针对CL系列芯片和MD、HD等类型芯片的外部晶振的值是不一样。内核文件里面默认CL系列需要使用25M的晶振,MD等系列使用8M的晶振。
所以按顺序找到晶振修改值的地方修改头文件宏定义即可。
系统时钟的设置函数是void SystemInit(void)
。在system_gd32f10x.c
文件中。在void SystemInit(void)
中system_clock_config()
是设置时钟的。
image.png
我们选择的是
__SYSTEM_CLOCK_108M_PLL_HXTAL
image.png
这个中的
_HXTAL
就是我们的外部晶振的值看对应函数
static void system_clock_108m_hxtal(void)
中的实现就可明白105和103这些系列的不同。image.png
原来的计算方法中。想要得到108M。CK_HXTAL就得是25M才行,我们修改过后CK_HXTAL是8M才可计算出108M。
然后看_HXTAL
的定义。在当前文件中看宏定义
image.png
然后点击找到
HXTAL_VALUE
的定义,在gd32f10x.h
头文件中image.png
此时我们发现,原来105是CL系列,默认外部晶振是25M。而实际上我们片子上装了8M的晶振,所以在这儿把晶振的值改成8M即可。
image.png
这样我们的波特率就好了。
总结:
单片机运行时第一要素是时钟,时钟一定要配置好,配置不好时钟所有外设都没法正常工作,而外设一般出问题可以先从系统时钟排查问题。
参考图
MD系列的时钟树和CL系列时钟树的不同
非CL系列(非互联系列)
image.png
CL系列(互联系列)
image.png