打印
[应用相关]

USART波特率计算方法解析

[复制链接]
604|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hoop|  楼主 | 2022-9-15 20:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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时钟源/分频系数

驱动实现
如下图

第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。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

322

帖子

0

粉丝