2019-06-05
为什么寄存器版本中,串口初始化函数有两个参数,pclk2和bound,
而库函数版中,只有bound一个参数:
以下内容整理自寄存器版的开发指南:
波特率计算公式
当OVER8 = 0 时
- Tx / Rx 就是波特率?
- fPCLKx是串口时钟
- PCLK1 用于 USART2~5
- PCLK2 用于 USART1 和USART6
- USARTDIV 是一个无符号定点数
波特率寄存器 USART_BRR
STM32F4 的每个串口都有波特率寄存器 USART_BRR,
32位,其中高16位保留
- mantissa是整数部分
- fraction是小数部分 * 16 (OVER8 = 0时乘16,OVER8 = 1 时乘不知道多少)
波特率计算举例
假设串口 1 要设置为 115200 的波特率,而 PCLK2 的时钟(即 APB2 总线时钟频率) 为 84M
求USARTDIV
USARTDIV
= fpCLK2 / 16 / 波特率
= 84000000/16/115200
= 45.572
故
整数部分为45,DIV_Mantissa = 45 = 0x2D
小数部分为0.572,DIV_Fraction = 0.572 * 16 =9.152 = 0x09
OVER8 位
接收器过采样设置位: OVER8 位,
该位在USART_CR1 寄存器里面设置,
当 OVER8=0 的时候,采用 16 倍过采样,可以增加接收器对时钟的容差,精度高,容错性好。
当 OVER8=1 的时候,可以获得更高的速度。
我们一般设置 OVER8=0,以得到更好的容错性,以下皆以 OVER8=0 进行介绍。
关于 OVER8 的详细介绍,请看《STM32F4xx 中文参考手册》第 26.3.3 节。
结论
波特率是由plk和其他一些寄存器的值共同决定的
确切的说,波特率由USART_CR1 寄存器里的OVER8位,波特率寄存器 USART_BRR的值,和对应的时钟pclk频率共同决定,公式在上方。
寄存器版中,将pclk的值作为参数,传进来参与计算
而库函数版中,可能是通过其他方式获得了时钟频率,因此可以直接设置波特率
即
void uart_init(u32 bound) //库函数版
void uart_init(u32 pclk2,u32 bound) //寄存器版
这两个函数中,bound参数一样时,可以认为效果是等价的