0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32串口波特率大小计算案例

454398 来源:博客园 作者:cposture 2020-10-23 14:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

波特率的计算

STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有个波特率寄存器USART_BRR,如下:

STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后12位用于表示整数。但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算。其实有关波特率的计算是下面这一条表达式:

从上面的表达式,我们引入了一个新量USARTDIV,它表示对串口的时钟源fck进行分频。假设我们已知道了波特率和fck时钟频率的大小,那么通过上式便可以计算出USARTDIV的具体大小,然后再通过USART的值大小对波特率寄存器进行设置。

USARTDIV通过上面的表达式得出,是一个带有小数的浮点数(如27.75)。将小数部分和整数部分分开,分别得到一个整数值n(如27)和一个小数值m(如0.75)。有了这两个值我们便可以填写USART_BRR寄存器进而设置我们串口波特率大小了。

将整数部分m(27 = 0x1B)直接写入USART_BRR的后12位部分;将小数部分n乘以16后得到的整数值(如0.75 x 16 = 12 = 0xC)写入USART_BRR前4位部分,最后USART_BRR的值为0x1BC。

注意:如果小数部分乘以16之后仍带有小数,则要四舍五入去除小数部分得到一个新的整数,再将其写入USART_BRR的前四位。

为什么在计算波特率的公式中要乘以16?

​我们知道串口通信是通过TXD和RXD这两条线进行通信的,当接收器的RXD连接着发送器的TXD,接收器的TXD连接着发送器的RXD,接收器和发送器可以通过RXD和TXD互传数据。当接收器检测到RXD这条线的电平被拉为低电平,立即开始接收发送器发送过来的数据,刚刚那个低电平只是一个告知接收器可以接收数据的起始位而已。

在数据的传输中,信号可能受到一些干扰而产生一些抖动,如下图。如果接收端只对这些信号数据采样一次,那么它有可能采样到的是抖动的不准的数据,进而使数据传输不准确,所以接收端在采样数据线上的数据,通常都要采样多次,然后通过比较获得准确的数据。

前面已经说过,USARTDIV,它表示对串口的时钟源fck进行分频,而这16表示的正是1bit数据的采样次数。为什么呢?

,将这个表达式的分子分母倒过来,可以得到下面这条表达式

每一位的传输时间只有1/TX_baud,这个总时间除以16,所以每采样一次的时间正好是T1,即新分频后的周期。而初始的串口时钟信号来自于APBx,APBx时钟信号需要经过分频才会等于T1,所以才需要分频USARTDIV。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2312

    文章

    11182

    浏览量

    374316
  • 串口通信
    +关注

    关注

    34

    文章

    1662

    浏览量

    58121
  • 时钟信号
    +关注

    关注

    4

    文章

    508

    浏览量

    30063
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    智能显示模块支持哪些波特率?智能显示模块怎么设置波特率

    智能显示模块支持哪些波特率?智能显示模块怎么设置波特率
    发表于 03-17 11:26

    硕博电子IO模块修改波特率和节点ID操作步骤

    正确设置波特率与节点ID,是保证IO模块与控制器稳定通信的关键。配置不当易引发设备失联、数据错乱等故障。本文将详细讲解波特率与节点ID的规范修改步骤,轻松搞定配置难题。
    的头像 发表于 01-27 10:39 665次阅读
    硕博电子IO模块修改<b class='flag-5'>波特率</b>和节点ID操作步骤

    使用内置晶振的话,串口波特率最大可以设置多少,不会丢包吗?

    之前我用ST的某芯片,采用内置晶振,将波特率设置115200,100ms收发一次数据发现就有丢包的情况了,想知道,芯源的MCU效果如何?有大佬试过使用内置晶振的话,串口波特率最大可以设置多少,不会丢包么
    发表于 01-19 06:48

    请问使用串口ISP波特率可以自己设定吗?

    请问使用串口ISP,波特率可以自己设定吗?
    发表于 01-14 08:27

    FDCAN 数据段波特率增加后发送失败的问题分析

    客户在使用 FDCAN 协议,仲裁段波特率配置位 1Mbit/s,数据段波特率配置为 5Mbit/s时,发现 FDCAN 发送功能异常。首先建议客户使用 IC 内部回环模式进行测试发现 5M
    发表于 01-04 11:16 0次下载

    请问波特率参数如何设置?

    波特率参数如何设置?
    发表于 12-24 08:05

    支持小数波特率的意义是什么

    我看芯源有一款MCU是支持小数波特率,支持小数波特率的意义是什么?是为了数据传输更稳定?
    发表于 12-11 07:15

    UART波特率计算及UART收发回显实验

    决定串口波特率的寄存器有BRR(Bite Rate Rigister),SEMR(Serial Extended Mode Rigister)和MDDR(Modulation Duty
    的头像 发表于 10-17 09:51 3252次阅读
    UART<b class='flag-5'>波特率</b><b class='flag-5'>计算</b>及UART收发回显实验

    ATClient配合USART_V2使用时,无法开at_client_init后修改串口波特率是怎么回事?

    。 AT_SW_VERSION_NUM为0x10301,RTTHREAD的版本为0x50002。 有另一个项目用的串口是V1版本则正常,感觉是ATClient和串口V2在波特率修改的使用上有些地方不太兼容
    发表于 10-09 09:10

    串口波特率设置1200用不了是怎么回事?

    mcu:stm32f407zg 调试时,设置波特率为1200,而串口输出为乱码,电脑设置波特率19200来接收mcu的数据,却能接收正确; (我以前没有用RTT时,用
    发表于 09-23 07:19

    115200的波特率,为啥实际速度只有11KB/s?

    波特率≠真实速度! 这几个概念确实容易混淆,但它们描述的是通信过程中不同层面的速率指标。让我们一起来理清楚它们的区别和联系↓ 主要区别解析 比特 (Bit Rate): 指每秒传输的二进制比特数量
    的头像 发表于 09-10 11:18 916次阅读

    波特率是什么

    波特率是串行通信中的一个核心参数,用于描述数据在传输线路上的传输速率。以下从定义、单位、与比特的关系、实际应用及设置注意事项等方面进行详细说明: 一、定义与本质 波特率(Baud Rate)指单位
    的头像 发表于 07-22 11:11 9363次阅读

    cyw43907串口数据错位问题怎么解决?

    1.串口数据会偶发错位问题,具体在附件中描述。 2.目前使用串口0进行通信,发现在配置波特率为460800的时候通讯异常,debug发现貌似是波特率误差过大,所以选择了467500,有
    发表于 07-09 08:16

    可编程电源的通信波特率应如何设置?

    (如RS-485专用电缆)并缩短通信距离。 在电源和PC端添加终端电阻(如120Ω)以减少信号反射。 问题3:多台电源通信冲突 原因:多台电源共用同一串口,地址冲突或波特率不一致。 解决: 为每台
    发表于 07-07 15:01

    基于瑞萨64位MPU RZ/G2L的uboot串口波特率支持介绍

    本文主要介绍基于瑞萨64位MPU RZ/G2L,讨论uboot下非常规波特率115200的支持方法,用于解决客户对uboot下特殊波特率的需求,供客户参考。
    的头像 发表于 07-04 15:54 3196次阅读
    基于瑞萨64位MPU RZ/G2L的uboot<b class='flag-5'>串口</b>多<b class='flag-5'>波特率</b>支持介绍