历史上的今天
今天是:2025年02月25日(星期二)
2020年02月25日 | 通过BUG来理解STM32的HSE时钟
2020-02-25 来源:eefocus
前言:最近在搞GPRS的时候,遇到了这么一个问题,所使用的单片机为STM32F103RBT6,刚开始先写了个串口打印的程序,波特率设置为19200,可是在上位机上输出的信息总是乱码,检查了好几遍的代码,硬件等等就是没找到问题。于是就在上位机上对波特率从115200往下一个一个的试,终于,当波特率设置为38400的时候,打印信息正确,额滴歌神啊,这是什么情况呢,我在程序中明明设置的波特率为19200,为什么上位机上波特率为19200的时候不对,而为38400的时候输出正确呢?于是,又回过头来检查电路原理图和代码,Oh,My god,原来问题在这里,因此这篇博客将以我遇到的问题为起点,对STM32的HSE时钟做一个总结。
一、问题
通过检查电路原理图,发现问题的根源所在,电路中所使用的晶振为16M,而我们经常使用的晶振为8M的,所以导致波特率变为2倍。
二、解决方法
因为使用的晶振为16M的,所以需要对程序中库函数要进行修改。那么,具体要修改哪呢?
1)修改system_stm32f10x.c文件。
/*
*@system_stm32f10x.c中的源代码部分
*@这部分代码为外部晶振为8M时的情况
*/
/*PLL configuration:PLLCLK = HSE * 9 = 72MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
/*
*@对system_stm32f10x.c中的源代码修改如下
*@修改后的代码对应的外部晶振为16M
*/
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_Div2 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
解释:通过对比发现,修改后的代码多了一句话。
RCC_CFGR_PLLXTPRE_Div2
那么,这句有什么作用呢?
RCC_CFGR:时钟配置寄存器,偏移地址为:0x04,复位值为:0x0000 0000。
PLLXTPRE:PREDIV1分频因子的低位。
Div2:二分频
所以增加的这句代码的意思就是对(3~25MHz)HSE振荡器进行二分频,而我们所使用的晶振为16M的晶振,二分频之后为8M,所以修改之后,波特率就一一对应了,而不再是二倍的关系了。
那么,这个bug就到此为止,解决了吗?No,这样程序还是有bug,那么bug在哪呢?又是如何解决呢?
2)修改stm32f10x.h文件
/*
*@stm32f10x.h中的源代码部分
*/
#define HSE_VALUE ((uint32_t)8000000)
/*
*@对stm32f10x.h做如下修改
*/
#define HSE_VALUE ((uint32_t)16000000)
解释:这句代码应该就不用解释了吧,很明显,就是将HSE的值由8M修改为16M。
通过解决Bug,下面来对STM32的HSE时钟做一个简单的总结。
三、HSE时钟总结
1、高速外部时钟HSE的时钟源
1)HSE外部晶体/陶瓷谐振器
2)HSE用户外部时钟
2、高速外部时钟HSE的范围
HSE时钟的范围为3~25MHz。
3、HSE时钟树

3、寄存器配置
略。感兴趣的读者可以阅读手册。
史海拾趣
|
以下设计题中,主CPU芯片均采用ATMega128L-8AU,供电电源为12V DC。 1. ATMega128L的工作电源为2.7V~5.5V DC,因此需要为CPU设计一个合适的电源系统,请使用LM2576-ADJ设计一个三端稳压电路,输出5V DC/3A供整个设计使用,需要设计电源指示灯 ...… 查看全部问答> |
|
最近IT业的人没有不知道iPhone 4的信号门,为此展开的口水战也屡见于各大媒体。“信号门”本不是什么好事,对于其他公司甚至可能是灭顶之灾,但苹果有个乔布斯,信号门不仅乔布斯出尽风头,出现在各大媒体头版头条,iPhone 4手机的销售也好像丝毫没 ...… 查看全部问答> |
|
MTK6225 手机开发板(含源代码) 有诚意者请联系 Qq:296662705 硬件特性: 1、 CPU:mtk6225 2、 TFLASH 卡接口 3、 176X220 2.6寸TFT LCD,最高支持320*240*16的TFT LCD 4、 4线触摸屏接口 5、 双声道音频输出 6、 一个Camera 130万像素 ...… 查看全部问答> |
|
因为手头的开发板是mips32+linux,嵌入式设备里,想添加java游戏,应该移植哪种JVM比较好,比较快,比较容易?据说kaffe是一个不错的JVM,有没有移植过的朋友,可以参考指点的,谢谢!… 查看全部问答> |
|
总说linux开发或者linux下的嵌入式开发,尽管在网上能搜罗到不少相关的信息,但总归没有一个清晰的概念和界定。 究竟在实际工作中是哪些东西的开发?分为哪几种?需要什么知识? 注:小弟我现在做java,由于对底层的偏爱,想转底层开发,学习 ...… 查看全部问答> |
|
有北京的朋友和我一起买扬创s3c2440的板子吗 http://www.yctek.com/shop/view_47.html 团够就可以便宜的。有意思的朋友可以留言。我看了。比这个价格还要便宜好几百呢。人越多他们说越便宜。… 查看全部问答> |
|
Xilinx FPGA & MATLAB SYSTEM GENERATOR FIR COMPILOR 调通了 基于MATLAB SYSTEM GENERATOR 的FIR滤波器终于调通了,模型如下: 参数如下: 输出波形如下图所示: 上图中,第一个波形是待滤波的波形,第二个是FIR数字滤波器的输出波形,第三个是MATLAB自带的滤波器。 然而,上述结果 ...… 查看全部问答> |
|
IAR中跑的好好的,换到MDK中就会莫名其妙的进Fault中断,请各位帮忙看看! 下面的程序在IAR中用的好好的,但是自己有点吹毛求疵了,还是习惯用MDK,所以就转到MDK下用,程序什么的都不变,只是把对应的driverlab.a文件换成了对应的driverlib.lib文件,build没有问题,下载进去也没问题,前面的串口输出也没问题,但程序一跑 ...… 查看全部问答> |
|
目前绝大部分的rtos都是没有基于mmu或者mpu来运行的,也就是说没有内存保护机制。在没有内存保护机制的前提下,最揪人心的莫过于任务栈空间的溢出了,任务栈空间的溢出随时就像一颗定时炸弹等着引爆,使用者浑身不自在。有没有100%的任务栈空间溢出 ...… 查看全部问答> |




