良许Linux教程网 干货合集 STM32串口自动识别波特率

STM32串口自动识别波特率

最近有朋友向我提问关于如何实现UART串口的自动识别波特率功能,今天我就在这里写一些相关的内容。

引言

关于UART串口自动识别波特率的问题,我相信有经验的项目开发者或者对串口比较熟悉的人应该多多少少了解一些自动识别的方法。

其中最常见而且比较有效的方法就是通过波特率一一匹配来实现。

这种方法通过软件来检测波特率,是最为常见的方法之一。

但是,除了通过软件检测波特率之外,还有一种方法是通过硬件本身完成波特率检测。

对于使用STM32的开发者来说,在ST官方提供的应用笔记和参考手册文档中都提到了这个方法。

接下来,我将结合相关的文档,简要介绍一下硬件自动波特率检测的内容。

2STM32硬件自动波特率检测

ABR:Auto Baud Rate,自动波特率检测使接收设备能够接受来自各种以不同速率工作的发送设备的数据,无需事先建立数据速率。

1.ABR应用地方

  • 事先不知道系统的通信速度。
  • 系统正在使用精确度相对较低的时钟源且该机制允许在不测量时钟偏差的情况下获得正确的波特率。

2.支持ABR系列

在STM32中,支持硬件自动波特率检测的只有部门系列才支持,之前出来比较早的系列不支持(如F1 F4),这后面推出来的系列都支持这个功能,包含最新才出来的STM32H7、G0系列都支持。

image-20231228183019776
image-20231228183019776

当然,对于内置ABR的STM32系列设备而言,并非所有实例化USART接口均支持自动波特率检测。

image-20231228183023015
image-20231228183023015

3.自动波特率检测模式

ABR是指接收设备通过检查第一个字符(通常是预先选择的标志字符)确定传入数据速率的过程。

STM32产品上的自动波特率检测功能内置的各种模式基于不同字符模式:

模式0:以“1”位为开头的任意字符;

模式1:以10xx模式开头的任何字符;

模式2:0x7F;

模式3:0x55;

image-20231228183027724
image-20231228183027724

提示:

**A.**在所有ABR模式下,都会在同步数据接收期间多次检测波特率,并将每一次的检测值与上一次的检测值进行比较。

**B.**在7位数据长度模式下,不支持0x7F和0x55帧检测ABR模式。

4.代码配置

相关代码,官方提供有基于(标准外设库、HAL库的)参考例程,比如F0标准外设库参考代码:

static void AutoBauRate_StartBitMethod(void)
{ 
  /* USART enable */
  USART_Cmd(EVAL_COM1, ENABLE);

  /* Configure the AutoBaudRate method */
  USART_AutoBaudRateConfig(EVAL_COM1, USART_AutoBaudRate_StartBit);

  /* Enable AutoBaudRate feature */
  USART_AutoBaudRateCmd(EVAL_COM1, ENABLE);

  /* Wait until Receive enable acknowledge flag is set */
  while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_REACK) == RESET)
  {}  

  /* Wait until Transmit enable acknowledge flag is set */  
  while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TEACK) == RESET)
  {}  

  /* Loop until the end of Autobaudrate phase */
  while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ABRF) == RESET)
  {}  

  /* If AutoBaudBate error occurred */
  if (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ABRE) != RESET)
  {
    /* Turn on LED3 */
    STM_EVAL_LEDOn(LED3);
  }
  else
  {
    /* Turn on LED2 */
    STM_EVAL_LEDOn(LED2);

    /* Wait until RXNE flag is set */
    while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_RXNE) == RESET)
    {}

    /* Wait until TXE flag is set */    
    while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET)
    {}

    /* Send received character */
    USART_SendData(EVAL_COM1, USART_ReceiveData(EVAL_COM1)); 

    /* clear the TE bit (if a transmission is on going or a data is in the TDR, it will be sent before
    efectivelly disabling the transmission) */
    USART_DirectionModeCmd(EVAL_COM1, USART_Mode_Tx, DISABLE);

    /* Check the Transfer Complete Flag */
    while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
    {}
  }

  /* USART Disable */
  USART_Cmd(EVAL_COM1, DISABLE);
}

5.ABR误差计算

由USART时钟源( fCK)决定通信速率范围(尤其是最大通信速率)。接收器采用不同的用户可配置过采样技术,可区分有效输入数据和噪声,从而用于恢复数据。这可以在最大通信速率与抗噪声/时钟不准确性之间实现平衡。

可通过编程USARTx_CR1寄存器中的OVER8位来选择过采样方法,可以是波特率时钟的16倍或8倍。

USART时钟源频率必须与预期通信速率兼容:

• 16倍过采样时,波特率介于fCK/65535与fCK/16之间。

• 8倍过采样时,波特率介于fCK/65535与fCK/8之间。

波特率误差取决于USART时钟源、过采样方法和ABR模式。

image-20231228183032767
image-20231228183032767

其中:

• 预期波特率取决于发送设备

• 实际波特率是USART接收器使用自动波特率检测操作确定的波特率。

6.误差

下图来自官方测试数据,基于:fCK = 72 MHz时ABR的误差计算,115200 bits/s预期波特率

image-20231228183035953
image-20231228183035953

从上图可以看出:ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。

不过,由于预期波特率与实际波特率之间的误差小于1%,因此所有模式的结果均正常。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部