你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32串口自动识别波特率的原理

[复制链接]
flyingstar 发布时间:2025-12-4 15:58
你的设备去连接对方设备,在不知道对方串口波特率的情况,如果能自动识别波特率,是不是很方便?1概述关于自动识别UART串口波特率的这个问题,相信有项目经验,或者认真研究过串口的朋友都应该多多少少知道一点自动识别的方法。
可能绝大部分知道的就是通过通过软件编程让波特率一一匹配来实现,这种方法也是最常见,而且还比较有效的一种方法。
上面这种方法就是大家熟知的通过软件来检测波特率的方法,其实,还有一种方法就是通过串口硬件自身完成波特率来检测。

针对STM32,在ST官方其实在应用笔记和参考手册文档中都有提到。下面,我结合文档简单讲下硬件自动波特率检测的内容。

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

1、ABR应用地方

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

2、支持ABR系列

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

微信图片_2025-12-04_154258_989.jpg

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

微信图片_2025-12-04_154303_925.jpg

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

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

  • 模式0:以“1”位为开头的任意字符
  • 模式1:以10xx模式开头的任何字符
  • 模式2:0x7F
  • 模式3:0x55

微信图片_2025-12-04_154308_629.jpg

提示:
1. 在所有ABR模式下,都会在同步数据接收期间多次检测波特率,并将每一次的检测值与上一次的检测值进行比较。
2. 在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模式。
微信图片_2025-12-04_154313_382.jpg

其中:
  • 预期波特率取决于发送设备;
  • 实际波特率是USART接收器使用自动波特率检测操作确定的波特率。

6、误差

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

微信图片_2025-12-04_154317_722.jpg

从上图可以看出:ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。
不过,由于预期波特率与实际波特率之间的误差小于1%,因此所有模式的结果均正常。
收藏 评论0 发布时间:2025-12-4 15:58

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版