良许Linux教程网 干货合集 关于USART波特率、TIM的外设预分频值

关于USART波特率、TIM的外设预分频值

对于使用和参考STM32标准外设库以及寄存器开发的朋友来说,也需要注意一些细节问题。

1USART串口预分频

很多人在使用寄存器开发时,需要对寄存器中的每一位都非常熟悉。但是在STM32中,外设的寄存器非常多,不像一些单片机(比如51系列)只有少数几个寄存器,而且这些寄存器使用起来也相对容易理解。

有些朋友可能已经注意到,当UART的波特率设置得太高或太低时,无法实现预期的效果。下面是波特率计算公式的示意图:

image-20231229202207335
image-20231229202207335

从上图可以看得出,波特率与fCK和USARTDIV。其中USARTDIV是一个无符号的定点数,这12位的值设置在USART_BRR寄存器

image-20231229202209823
image-20231229202209823

结合上面图文,大家应该可以知道,波特率也是有一个范围的,而且波特率是存在误差的。

举一个例子:fCK = 36M, 波特率 = 100,那么计算出USARTDIV = 36M / 1600 = 22500.

然而,12位的数最大为4095,所以,越界了。

写这些其实希望不管你使用寄存器,还是库开发,其实都需要了解这些,避免入坑。

2TIM定时器预分频

前面有朋友问了我关于TIM定时器的问题,说自己参考STM32标准外设库,配置定时器,但是定时却不准确。

经过交谈,他把配置代码截图给我看了。我一看,就看出问题出在预分频值上。

image-20231229202212789
image-20231229202212789

而这位朋友是使用STM32F407,主频168M,他想让定时器每秒计数1000个,就是上面“SystemCoreClock / 1000”。

然而,他却没有考虑溢出问题:168M / 1000 = 168K,PrescalerValue最大值为65535.

另一个关于APB1、APB2时钟问题

有朋友发现自己配置的定时会相差一倍,其实原因也是在于预分频值不对造成的。

让大家看一下下图两个预分频宏定义:

image-20231229202215518
image-20231229202215518

原因在于:有的TIM定时器时钟是APB1,有的是APB2。这两个时钟一般默认配置是相差一倍,所以定时也就会相差一倍。

关于TIM使用的APB时钟差异,大家可以通过查看“参考手册”RCC章节,或结合STM32Cube工具理解。

定时器RCC时钟:

image-20231229202218633
image-20231229202218633

定时器Cbue时钟配****置:

image-20231229202221242
image-20231229202221242

希望大家都了解这些配置,今天暂时就写到这里,希望对你有帮助!

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部