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

为什么寄存器版本中,串口初始化函数有两个参数,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参数一样时,可以认为效果是等价的

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
波特率分频值的计算公式为:Baud Rate = fclk / (16 × (div + 1)) 其中,fclk为UART的时钟频率,div为波特率分频值。 根据题意,PCLK1频率为36MHz,UART2为APB1总线上的外设,它的时钟源来自于PCLK1,即UART2的时钟频率为36MHz。所以,将fclk取36MHz。 将波特率115200带入公式可得,div = (36000000 / (16 × 115200)) - 1 = 18.5 ≈ 19 因为波特率分频值必须为整数,所以我们需要向上或向下取整。这里选择向下取整,所以将div设置为19。 接下来是UART2初始化函数UART2Init()的代码实现: ``` void UART2Init(void) { // 使能UART2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 初始化UART2 GPIO引脚 GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // 初始化UART2 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_Odd; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); // 使能UART2接收中断 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 使能UART2 USART_Cmd(USART2, ENABLE); } ``` 该函数的作用是初始化UART2,包括使能UART2时钟、初始化UART2的GPIO引脚、初始化UART2的波特率、数据位、停止位、奇偶校验等参数,使能UART2接收中断以及使能UART2。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值