串口波特率计算详解

STM32下波特率计算详解

波特率的计算

    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。
  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
串口通讯是一种设备间常用的串行通讯方式,其通讯协议可分为物理层和协议层。物理层规定了通信协议中具有机械、电子功能的特性,确保原始数据在物理媒体的传播;协议层主要规定了通讯逻辑,统一双方的数据打包、解包标准。常见的串口通讯接口是串行通信接口(通常指COM接口)。 在串口通讯中,需要约定好以下几个要素: 1. 波特率:即每秒传输的码元个数,常见的波特率有4800、9600、115200等。双方需要约定一致的波特率,以便对信号进行解码。 2. 起始和停止信号:数据包的首尾分别是起始位和停止位,起始信号由一个逻辑0的数据位表示,停止位信号可以由0.5、1、1.5、2个逻辑1的数据位表示,双方需要约定一致的起始和停止信号。 3. 有效数据:有效数据规定了主体数据的长度,一般为8或9位。 4. 数据校验:为了解决数据传输过程中受到外部干扰导致的数据偏差问题,可以在有效数据之后加入校验位。常见的校验方法有奇校验、偶校验、0校验、1校验以及无校验,双方需要约定一致的校验方法。 在STM32的USART串口通讯中,波特率、起始和停止信号、有效数据以及数据校验等设置都是通过串口初始化结构体来实现的。STM32的USART是一种广泛使用的串行通讯协议,可以在电子设备中进行简单便捷的通讯。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [串口通信的基本原理详解](https://blog.csdn.net/qq_44045338/article/details/107056480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32_基础入门(九)_串口通讯详解](https://blog.csdn.net/weixin_50546241/article/details/123152107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值