串口 pclk2和波特率到底有什么关系?

2019-06-05
为什么寄存器版本中,串口初始化函数有两个参数,pclk2和bound,
而库函数版中,只有bound一个参数:

以下内容整理自寄存器版的开发指南:

波特率计算公式

当OVER8 = 0 时


15426916-f6d7bbe9d17985ff.png
image.png
  • Tx / Rx 就是波特率?
  • fPCLKx是串口时钟
    • PCLK1 用于 USART2~5
    • PCLK2 用于 USART1 和USART6
  • USARTDIV 是一个无符号定点数

波特率寄存器 USART_BRR

STM32F4 的每个串口都有波特率寄存器 USART_BRR
32位,其中高16位保留

15426916-b8a66461c181e307.png
image.png

  • 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参数一样时,可以认为效果是等价的

转载于:https://www.jianshu.com/p/cb35cb921a4a

猜你喜欢

转载自blog.csdn.net/weixin_34236869/article/details/91081621