使用、参考stm32标准外设库,寄存器开发的朋友也需要注意一些细节问题。
1usart串口预分频
许多朋友用寄存器开发,就需要对寄存器中每一位十分熟悉才行。
但是在stm32中外设的寄存器很多,不像51这类单片机,就那么为数不多的寄存器,而且寄存器也能很容易理解。
有朋友其实已经发现,uart波特率设置太高,或太低就不能实现了。看下图波特率计算公式:
从上图可以看得出,波特率与fck和usartdiv。其中usartdiv是一个无符号的定点数,这12位的值设置在usart_brr寄存器。
结合上面图文,大家应该可以知道,波特率也是有一个范围的,而且波特率是存在误差的。
举一个例子:fck = 36m,波特率 = 100,那么计算出usartdiv = 36m / 1600 =22500.
然而,12位的数最大为4095,所以,越界了。
写这些其实希望不管你使用寄存器,还是库开发,其实都需要了解这些,避免入坑。
2
tim定时器预分频
前面有朋友问了我关于tim定时器的问题,说自己参考stm32标准外设库,配置定时器,但是定时却不准确。
经过交谈,他把配置代码截图给我看了。我一看,就看出问题出在预分频值上。
而这位朋友是使用stm32f407,主频168m,他想让定时器每秒计数1000个,就是上面“systemcoreclock / 1000”。
然而,他却没有考虑溢出问题:168m / 1000 = 168k,prescalervalue最大值为65535.
另一个关于apb1、apb2时钟问题
有朋友发现自己配置的定时会相差一倍,其实原因也是在于预分频值不对造成的。
让大家看一下下图两个预分频宏定义:
原因在于:有的tim定时器时钟是apb1,有的是apb2。这两个时钟一般默认配置是相差一倍,所以定时也就会相差一倍。
关于tim使用的apb时钟差异,大家可以通过查看“参考手册”rcc章节,或结合stm32cube工具理解。
定时器rcc时钟:
定时器cbue时钟配置:
夏普四原色液晶电视技术定名Quattron
四款嵌入式中应用常见的网络协议栈
SBO2连接器与车用连接器产品介绍
单片机串口发送数据很慢?这种方法帮助你提高!
免维护蓄电池怎么加水
关于USART波特率 TIM的外设预分频值
华为轮值CEO郭平:华为将新增13个开放实验室
电容式触摸传感器设计技巧
W634GU8NB11IW634GU8NB11JW634GU8NB-12华邦内存
工厂生活用水排水管网流量水位监测仪器参数
麦捷科技拟购安可远100%股权和金之川20%股权
电机节能的六种方案
NVIDIA宣布推出面向游戏笔记本电脑的GeForce® GTX® 1660 Ti 和1650 Turing GPU
基于兵棋推演系统的作战方案评估方法研究
一文读懂调制、解调和变频
游戏蓝牙耳机哪款值得买?2021性价比最高的十款游戏蓝牙耳机
磁珠的工作原理和应用介绍
环球仪器将“智慧”亮相IPC 首个APEX互联展
嘀嗒哈啰等顺风车平台公司被约谈,嘀嗒哈啰回应将尽快整改
详解IBM、谷歌的AI布局