从波特率不对应引发的时钟问题解决

问题:

使用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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容