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
    +关注

    关注

    2239

    文章

    10662

    浏览量

    348452
  • 串口通信
    +关注

    关注

    32

    文章

    1574

    浏览量

    54844
  • 时钟信号
    +关注

    关注

    4

    文章

    364

    浏览量

    28031
收藏 人收藏

    评论

    相关推荐

    STM32F412串口波特率最大调到3.1M就上不去了,怎么解决?

    之前,用STM32F407的芯片做了串口usart6通讯,波特率调整到3.9M可以正常通讯,发送的数据也都对。现在换STM32F412后发现最大频率的
    发表于 04-02 07:50

    stm32mp157在linux系统下,串口波特率如何使用非标准波特率

    请问stm32mp157在linux系统下,串口波特率如何使用非标准波特率153600。内核或者设备树里需要怎么改动? 麻烦答复一下,最好能给个详细的更改示例,谢谢!
    发表于 03-14 06:21

    什么是串口波特率串口通信为什么要设置波特率

    什么是串口波特率串口通信为什么要设置波特率波特率与比特率的关系 如何选择串口
    的头像 发表于 01-22 16:10 486次阅读

    TC377波特率计算是否与帧大小有关?

    brZ 如图 471 所示, 我想知道这个波特率计算是否与帧大小有关? 例如,4 位帧、8 位帧、32 位帧?波特率是指一帧/秒吗? 对于 32 位帧,它是 32 位/秒?
    发表于 01-22 06:29

    请问arduino如何自动设置串口波特率?

    arduino 如何自动设置串口波特率? 根据通讯机的波特率自动设置本身的波特率
    发表于 11-10 07:16

    什么是串口波特率串口通信为什么要设置波特率

    在电子设备的世界中,数据是通过各种方式进行传输的。其中,串口通信是一种常见的数据传输方式,它以其简单、可靠和广泛的特性,成为了电子设备间通信的重要手段。而在串口通信中,有一个非常重要的参数——波特率
    的头像 发表于 11-03 08:21 1536次阅读
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b>通信为什么要设置<b class='flag-5'>波特率</b>?

    STM32中如何对CAN波特率进行计算?

    STM32中如何对CAN波特率进行计算
    发表于 11-03 07:06

    Ch559串口0的怎么达到115200的波特率

    Ch559串口0的怎么达到115200的波特率
    发表于 10-31 07:24

    请问stm32串口可配置的波特率有哪些?

    stm32f1的串口波特率最大支持4.5M,但是我们一般使用的波特率一般是120024004800960014400192003840057600115200 和 230400bps,
    发表于 09-26 07:18

    一个严谨的STM32串口DMA发送&amp;接收(1.5Mbps波特率)机制

    一个严谨的STM32串口DMA发送&接收(1.5Mbps波特率)机制
    的头像 发表于 09-18 10:58 1675次阅读
    一个严谨的<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>DMA发送&amp;接收(1.5Mbps<b class='flag-5'>波特率</b>)机制

    串口传输速率低于波特率怎么办 串口通信的波特率如何设置

    如果串口传输速率低于波特率,您可以尝试以下方法来解决问题:   1. 检查硬件连接:确保串口连接正确且牢固。检查连接线是否完好,确保没有松动或断开的接触。   2. 检查波特率设置
    的头像 发表于 09-08 16:23 3461次阅读

    什么是串口波特率串口波特率的分类及应用详解

    什么是串口波特率串口波特率是指串口通信系统中传输数据的速率。在UART串口通信中,数据以位(bi
    的头像 发表于 08-08 10:09 3174次阅读
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>的分类及应用详解

    stm32mp157串口如何使用非标准波特率

    请问stm32mp157在linux系统下,串口波特率如何使用非标准波特率153600。内核或者设备树里需要怎么改动? 麻烦答复一下,最好能给个详细的更改示例,谢谢!
    发表于 08-07 07:34

    NUC130串口用PDMA收发,把波特率改为任意的波特率串口不接收了怎么解决?

    有人用NUC130的么,串口用PDMA收发,出现一个问题,假如波特率是:19200,固定不变,与串口助手通信是正常的,,当串口助手,把波特率
    发表于 06-27 06:25

    波特率是什么?波特率设计

    从宏观理解,波特率表征了串口的传输速度。
    的头像 发表于 06-05 15:19 1w次阅读
    <b class='flag-5'>波特率</b>是什么?<b class='flag-5'>波特率</b>设计