硬汉嵌入式论坛

 找回密码
 立即注册
查看: 809|回复: 2
收起左侧

[客户分享] USART波特率计算方法解析

[复制链接]

38

主题

4

回帖

118

积分

初级会员

积分
118
发表于 2022-9-15 20:50:42 | 显示全部楼层 |阅读模式
USART波特率计算方法解析
USART 波特率发生器
USART 内置波特率发生器,其通过使用以PCLKx为基准的内部计数器进行计数,由用户设定其该计数器的溢出值(通常也称作分频系数),每计数达到一次溢出代表一位数据,故每位数据位宽就是分频系数个PCLKx周期。
用户通常可通过调整PCLKx以及分频系数来产生特定的USART波特率。以下基于AT32F435的USART1为例对其进行解析

关键词简介
USART时钟源:即USART波特时钟的来源。USART1的来源为PCLK2,PCLK2由HCLK分频而来,HCLK由系统时钟分频而来。当系统时钟为288MHz,HCLK不分频,PCLK2二分频时,此时PCLK2时钟为144MHz
目标波特率:即应用需求的USART波特率。可根据需求随意设定(但必须保障收发双发波特率一致),通常为9600、38400、115200等一些常见的典型波特率。
分频系数:即对PCLK2的分频值。为达到期望的波特率,必须要对PCLK2进行分频,该分频系数可配置为0~0xFFF内的任意满足需求的值

波特率公式
USART波特率 = USART时钟源/分频系数

驱动实现
如下图
USART波特率.PNG
第119行到第127行为获取“apb_clock”,即获取USART时钟源。需要注意不同的串口所挂载的PCLK总线不同
第128行到第136行为计算“分频系数”,通过波特率公式而来。且为更接近目标波特率,采用“四舍五入”进行处理
第137行即为将计算得到的分频系数实际写入USART_BAUDR寄存器。
示例:
1)系统时钟为288MHz,PCLK2做二分频,目标波特率为115200时,“分频系数”=288000000/2/115200=1250,实际写入USART_BAUDR寄存器值应为1250(即十六进制的0x4E2)。
2)系统时钟为288MHz,PCLK2做二分频,USART_BAUDR寄存器值为0x3A98(即十进制15000)时,“波特率”=288000000/2/15000=9600。

注:
A.USART波特率的配置需要在USART使能前进行配置;
B.不同的USART挂载的PCLKx不同,应用需要自己计算波特率时要注意PCLKx的分频;
C.PCLKx过大时,某些极限波特率无法达到(比如PCLK为144MHz时,无法实现1200的USART波特率),此时可通过增加分频来降低PCLKx。

回复

使用道具 举报

2

主题

269

回帖

275

积分

高级会员

积分
275
发表于 2022-9-16 09:22:20 | 显示全部楼层
我都是抄hal库的stm32xx_hal_uart.c --> UART_SetConfig() 中寄存器 BRR 配置部分简单粗暴

comSetBaud
https://github.com/cctv180/STM32 ... /bsp/src/bsp_uart.c
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-9-21 08:48:03 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 10:41 , Processed in 0.257559 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表