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

描述

使用、参考STM32标准外设库,寄存器开发的朋友也需要注意一些细节问题。

1USART串口预分频

许多朋友用寄存器开发,就需要对寄存器中每一位十分熟悉才行。

但是在STM32中外设的寄存器很多,不像51这类单片机,就那么为数不多的寄存器,而且寄存器也能很容易理解。

有朋友其实已经发现,UART波特率设置太高,或太低就不能实现了。看下图波特率计算公式:

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

Tim

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

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

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

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

2

TIM定时器预分频

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

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

Tim

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

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

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

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

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

Tim

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

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

定时器RCC时钟:

Tim

定时器Cbue时钟配置:

Tim

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分