与APB计算定时器频率相似
同样在datasheet中查找串口使用的总线
STM32串口波特率通过USART_BRR进行设置
可以看到USART1挂在APB2,APB2总线的速率是84MHz
可以使用USART_BRR寄存器(波特率寄存器)中的USARTDIV值来计算串口的通讯速率
在该寄存器中,前12位用来表示USARTDIV的整数部分,后4位用来表示小数部分,小数部分乘16后取整,然后存储在后4位中。
-
USARTDIV计算波特率的公式为:
- Tx / Rx 波特率 = fPCLKx/(16*USARTDIV)
- fPCLKx:总线的速率(时钟频率,APB2为84MHz)
- USARTDIV:一个无符号的定点数,这12位的值设置在USART_BRR寄存器,表示对串口的时钟源fck进行分频
-
16:1bit数据的采样次数(在数据传输过程中信号会受到干扰而不准确,因此我们需要对数据进行多次采样才能得到比较准确的数据)
-
USARTDIV计算公式为:
- USARTDIV= fPCLKx/(16*Tx / Rx 波特率)
- 例:fPCLK2=84MHz,波特率为115200,则USARTDIV=84MHz/(16*115200)=45.572
- 将结果的45转换为16进制,即0x2D,小数0.572*16=9.152(取整9),转换为16进制为9,即存储在USART_BRR中的值最终为0x2D9
如果我们知道了波特率和时钟频率的大小,我们就可以先计算出USARTDIV的大小,然后再通过USART的值大小对波特率寄存器进行设置
然后在知道了USARTDIV后我们可以计算出BRR寄存器,进而设置串口波特率的大小
- 补充:
每一位的传输时间只有1/TX_baud,这个总时间除以16,所以每采样一次的时间正好是T1,即新分频后的周期。而初始的串口时钟信号来自于APBx,APBx时钟信号需要经过分频才会等于T1,所以才需要分频USARTDIV。
参考资料
关于STM32串口波特率的产生,以及USARTDIV写入到USART_BRR寄存器的值
STM32串口波特率计算问题和常用波特率