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

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

3天内不再提示

STM32的USART自动波特率检测

airX嵌入式 来源:airX嵌入式 作者:airX嵌入式 2022-11-28 11:15 次阅读

《前言》

正确的USART通信要求发送和接收波特率的匹配度足够高,否则可能发生通信错误。

当在两个设备之间建立通信链路时,自动波特率检测十分有用,因为从设备能够检测到主控制器的波特率并进行相应的自我调整。这需要使用一种自动机制来确定波特率。

某些STM32器件中内置的USART外设提供许多功能,包括硬件自动波特率检测。

本应用笔记旨在介绍STM32微控制器的自动波特率检测功能,并为没有在硬件中实现此功能的STM32器件提供替代软件方法。

本应用笔记适用于表 1中所列产品

383d3910-6eca-11ed-8abf-dac502259ad0.png

《硬件自动波特率检测》

1、特性概述

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

在一些STM32产品中,USART能够使用专用硬件自动确定波特率。

表 2提供了支持自动波特率检测的STM32系列设备的概述。

38656caa-6eca-11ed-8abf-dac502259ad0.png

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

表 3详细说明了这一限制。

388a70fe-6eca-11ed-8abf-dac502259ad0.png

2、自动波特率检测模式

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

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

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

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

•0x7F:模式2

•0x55:模式3

38c483fc-6eca-11ed-8abf-dac502259ad0.png

在激活自动波特率检测之前,必须通过USARTx_CR2寄存器中的ABRMOD[1:0]字段选择一种ABR模式。在所有ABR模式下,都会在同步数据接收期间多次检测波特率,并将每一次的检测值与上一次的检测值进行比较。

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

3、ABR误差计算

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

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

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

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

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

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

38eed206-6eca-11ed-8abf-dac502259ad0.png

其中:

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

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

《软件自动波特率检测》

如果不支持硬件自动波特率检测,可采用本节描述的软件方法。

软件方法的理念是发送0x7F数据帧到USARTx_RX引脚。这将连接到EXTI线路,该线路被配置为在每个上升沿生成中断。

使用Systick定时器测量两个上升沿之间间隔的持续时间。此持续时间对应于8位的持续时间,因此

•位时间 = 计算的持续时间 / 8

•波特率 = 1/位时间

然后,根据计算的波特率值进行USARTx_BRR寄存器编程。

390cf4f2-6eca-11ed-8abf-dac502259ad0.png

《软件和硬件方法设置》

此设置示例使用的是内置硬件自动波特率检测功能的STM32F303xD/E。

PC应用“超级终端”用于向/从STM32F303发送/接收数据帧。因此,测试的是介于600bits/s至115200 bits/s之间的标准波特率。使用另一个STM32F3器件作为发送器测试可以达到的最高波特率值(9 Mbits/s)。

1、USART1配置示例

在两个示例中,STM32 USART1的配置如下:

/*##-1- Configure the UART peripheral ######################################*/
 /* Put the USART peripheral in the Asynchronous mode (UART Mode) */
 /* UART configured as follows:
- Word Length = 8 Bits
- Stop Bit = One Stop bit
- Parity = NONE parity
- BaudRate = 115200 baud It can be any other value as the USARTx_BRR register will be 
reprogrammed 
- Hardware flow control disabled (RTS and CTS signals)
- The oversampling mode is 8 or 16 (Both are tested) 
*/
 UartHandle.Instance = USARTx;
 UartHandle.Init.BaudRate = 115200; 
 UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
 UartHandle.Init.StopBits = UART_STOPBITS_1;
 UartHandle.Init.Parity = UART_PARITY_NONE;
 UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 UartHandle.Init.Mode = UART_MODE_TX_RX;
 UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;

注:

USART1时钟源是使用HSE PLL时钟源的72 MHz系统时钟。(某些测试使用HSI时钟作为USART1时钟源来执行。这是为了检查HSI不准确性对结果的影响。)

2、硬件自动波特率检测

USART1被配置为自动检测波特率。用户必须在USART1初始化函数中选择ABR模式,如下所示:

/*##-2- Configure the AutoBaudRate method */
UartHandle.AdvancedInit.AdvFeatureInit =UART_ADVFEATURE_AUTOBAUDRATE_INIT;
UartHandle.AdvancedInit.AutoBaudRateEnable = 
UART_ADVFEATURE_AUTOBAUDRATE_ENABLE;
/*Uncomment your appropriate mode */
//UartHandle.AdvancedInit.AutoBaudRateMode = 
UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; 
//UartHandle.AdvancedInit.AutoBaudRateMode = 
UART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE;
//UartHandle.AdvancedInit.AutoBaudRateMode = 
UART_ADVFEATURE_AUTOBAUDRATE_ON0X7FFRAME;
//UartHandle.AdvancedInit.AutoBaudRateMode = 
UART_ADVFEATURE_AUTOBAUDRATE_ON0X55FRAME; 
if (HAL_UART_Init(&UartHandle) != HAL_OK)
{
/* Initialization Error */
 Error_Handler();
}
/* Wait until Receive enable acknowledge flag is set */
while(__HAL_UART_GET_FLAG(&UartHandle,UART_FLAG_REACK) == RESET)
{} 
/* Wait until Transmit enable acknowledge flag is set */ 
while(__HAL_UART_GET_FLAG(&UartHandle,UART_FLAG_TEACK) == RESET)
{}
/* Loop until the end of Autobaudrate phase */
while(__HAL_UART_GET_FLAG(&UartHandle,UART_FLAG_ABRF) == RESET)
{}

在整个初始化过程完成后,USART等待从超级终端接收数据,然后开始自动波特率检测阶段。通过ABRF标志监测此阶段的结束。

•如果自动波特率检测操作不成功,则ABRE标志置位

•如果自动波特率检测操作成功完成,则向超级终端发送确认数据。

/* If AutoBaudBate error occurred */
if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ABRE)!= RESET)
{
 Error_Handler();
}
else
{
 /* Wait until RXNE flag is set */
 while(__HL_UART_GET_FLAG(&UartHandle,UART_FLAG_RXNE) == RESET)
 {} 
 /* Send acknowledgement message*/
 if (HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)aTxBuffer, TXBUFFERSIZE) != HAL_OK)
 {
 /* Transfer error in transmission process */
 Error_Handler();
 }
 while (HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
 {
 }
}

3、软件自动波特率检测

表 5详细说明了软件方法。

3934d0b2-6eca-11ed-8abf-dac502259ad0.png

3963717e-6eca-11ed-8abf-dac502259ad0.png

399fc598-6eca-11ed-8abf-dac502259ad0.png

4、误差计算

图 2显示ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。

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

39cd0bde-6eca-11ed-8abf-dac502259ad0.png

图 3显示在通常情况下,当由72 MHz系统时钟为USART提供时钟(HSE作为PLL时钟源)时,结果优于USART时钟源使用HSI时钟。这要归因于HSI的相对不准确性。

3a02ce04-6eca-11ed-8abf-dac502259ad0.png

图 4显示在大多数情况下,硬件方法提供的结果优于软件方法。不过,在某些情况下,软件方法能够提供相比于使用硬件方法时更好的结果。

3a2fd07a-6eca-11ed-8abf-dac502259ad0.png

图 5显示:

•使用硬件方法时,达到最大波特率9 Mbits/s时误差为0%。

•使用软件方法时,达到最大波特率时误差为约30%,这要归因于执行中断处理程序所花费的CPU周期。

3a555db8-6eca-11ed-8abf-dac502259ad0.png

《结论》

此应用笔记描述了某些STM32器件内置的硬件自动波特率检测功能。它还提供了在软件中实现此功能的技术,作为STM32器件没有在硬件中实现此功能的解决方案。

尽管示例中的自动波特率检测均应用在示例的开头部分,但是可以进行扩展并在每次发送和接收设备检测到通信错误时使用。当主机使用不同波特率进行通信时,这一特性可实现应用的稳健性。

审核编辑 :李倩

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

    关注

    18

    文章

    5970

    浏览量

    135853
  • STM32
    +关注

    关注

    2266

    文章

    10871

    浏览量

    354796
  • USART
    +关注

    关注

    1

    文章

    195

    浏览量

    30791

原文标题:STM32的USART自动波特率检测

文章出处:【微信号:airX嵌入式,微信公众号:airX嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    波特率与串行通信的关系 各种设备波特率转换的方法

    波特率(Baud Rate)是串行通信中的一个重要参数,它指的是信号传输的速率,即单位时间内传输的符号(或信号状态)的数量。在串行通信中,波特率决定了数据传输的速度,因此对于通信效率和设备兼容性
    的头像 发表于 11-22 10:01 84次阅读

    常见的波特率标准和协议

    波特率是指在数据通信中,每秒钟传输的符号数(或比特数),是衡量数据通信速度的重要指标。在不同的通信协议和场景中,常见的波特率标准和协议有所不同。以下是一些常见的波特率标准和协议: 一、串口通信
    的头像 发表于 11-22 09:56 116次阅读

    波特率的定义和计算方法 波特率与数据传输速度的关系

    波特率的定义 波特率(Baud Rate),又称调制速率或传符号,是指每秒传输的符号数目,单位为波特(Bd)。它是一个数字信号通信中重要的参数,在串行通信协议中经常被用作衡量串行数据
    的头像 发表于 11-22 09:49 130次阅读

    MCU串口自动识别波特率原理分析

    现在的单片机资源越来越丰富了,其中我们常用的串口也是内部集成了多个,关键功能也越来越强了。 我们有些应用可能会用到串口自动识别波特率,今天就来讲讲MCU串口自动识别波特率底层的常见的原
    的头像 发表于 10-23 16:12 326次阅读
    MCU串口<b class='flag-5'>自动</b>识别<b class='flag-5'>波特率</b>原理分析

    波特率9600和115200的区别

    在现代通信技术中,数据传输速率是一个关键的性能指标。对于串行通信,波特率是衡量数据传输速度的基本单位。波特率9600和115200是两种常见的设置,它们在不同的应用场景中有着各自的优势和局
    的头像 发表于 10-18 14:56 886次阅读

    波特率与比特有何关系 波特率与数据传输速率的关系

    波特率(Baud Rate)和比特(Bit Rate)是衡量数据通信系统性能的两个重要参数,它们之间有着密切的关系,但并不完全相同。 波特率(Baud Rate): 波特率是指在数据
    的头像 发表于 10-18 14:55 441次阅读

    uart波特率和传输频率的关系 UART串口的常用波特率为多少

    UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的异步串行通信技术,它允许两台设备之间进行双向数据传输。在UART通信中,波特率和传输
    的头像 发表于 10-06 16:12 1764次阅读
    uart<b class='flag-5'>波特率</b>和传输频率的关系 UART串口的常用<b class='flag-5'>波特率</b>为多少

    485自动收发电路的波特率是多少

    485自动收发电路的波特率并不是一个固定的值,而是可以根据具体的应用需求和电路设计进行调整的。在实际应用中,波特率的设置会受到多种因素的影响,包括传输距离、信号衰减、噪音环境、设备性能以及通信协议
    的头像 发表于 07-13 09:41 2205次阅读

    如何使用示波器测量串口波特率

    在通信和电子测量领域,串口波特率是一个至关重要的参数,它决定了数据在串行通信线上的传输速率。使用示波器来测量串口波特率是一种常见且有效的方法,尤其是在没有专业串口调试工具或需要更精确测量时。本文将
    的头像 发表于 05-27 16:25 4460次阅读

    芯海应用笔记:通用 MCU USART 自动波特率检测

    本文档介绍和说明芯海科技旗下 CS32 系列 MCU 的自动波特率检测功能,并为不具备硬件自动波特率检测的 MCU 产品提供替代软件方法 。*附件:应用笔记:芯海通用MCU
    发表于 05-16 11:42

    波特率有什么危害尼?又该如何避免?

    深入探讨了波特率过高可能带来的危害,并提供了一些实用建议来保护设备不受影响。在通信领域,波特率是决定数据传输速度的重要参数。然而,波特率设置不当可能会对设备造成严重的影响。本文旨在揭示波特率
    的头像 发表于 04-03 16:45 1267次阅读

    为啥要转换波特率 波特率和传输速率的关系

    对于串行多主 CAN 总线,如果波特率被称为“500000波特”,则 CAN 上的该端口每秒最多可传输500000位。
    的头像 发表于 03-06 17:38 4614次阅读
    为啥要转换<b class='flag-5'>波特率</b> <b class='flag-5'>波特率</b>和传输速率的关系

    波特率发生器使用哪个定时器 波特率发生器的时钟来源是什么

    波特率发生器是一种用于控制串行数据通信速率的设备,它可以生成特定波特率的时钟信号。在嵌入式系统、通信设备和计算机硬件中,波特率发生器的使用十分常见。波特率发生器通常使用定时器来实现时钟
    的头像 发表于 01-24 09:56 1898次阅读

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

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

    单片机的各个通信协议的波特率

    下面是一些常见的波特率数值,这些波特率通常被用于串口通信,SPI、I2C、CAN等接口的实际波特率可能有所不同:USART:110bps300bps600bps1200bps2400b
    的头像 发表于 12-09 08:00 2815次阅读
    单片机的各个通信协议的<b class='flag-5'>波特率</b>