《前言》
正确的USART通信要求发送和接收波特率的匹配度足够高,否则可能发生通信错误。
当在两个设备之间建立通信链路时,自动波特率检测十分有用,因为从设备能够检测到主控制器的波特率并进行相应的自我调整。这需要使用一种自动机制来确定波特率。
某些STM32器件中内置的USART外设提供许多功能,包括硬件自动波特率检测。
本应用笔记旨在介绍STM32微控制器的自动波特率检测功能,并为没有在硬件中实现此功能的STM32器件提供替代软件方法。
本应用笔记适用于表 1中所列产品。
《硬件自动波特率检测》
1、特性概述
自动波特率检测(ABR)使接收设备能够接受来自各种以不同速率工作的发送设备的数据,无需事先建立数据速率。
在一些STM32产品中,USART能够使用专用硬件自动确定波特率。
表 2提供了支持自动波特率检测的STM32系列设备的概述。
对于内置ABR的STM32系列设备而言,并非所有实例化USART接口均支持自动波特率检测。
表 3详细说明了这一限制。
2、自动波特率检测模式
ABR是指接收设备通过检查第一个字符(通常是预先选择的标志字符)确定传入数据速率的过程。
STM32产品上的自动波特率检测功能内置的各种模式基于不同字符模式:
•以“1”位为开头的任意字符:模式0
•以10xx模式开头的任何字符:模式1
•0x7F:模式2
•0x55:模式3
在激活自动波特率检测之前,必须通过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模式。
其中:
•预期波特率取决于发送设备
•实际波特率是USART接收器使用自动波特率检测操作确定的波特率。
《软件自动波特率检测》
如果不支持硬件自动波特率检测,可采用本节描述的软件方法。
软件方法的理念是发送0x7F数据帧到USARTx_RX引脚。这将连接到EXTI线路,该线路被配置为在每个上升沿生成中断。
使用Systick定时器测量两个上升沿之间间隔的持续时间。此持续时间对应于8位的持续时间,因此
•位时间 = 计算的持续时间 / 8
•波特率 = 1/位时间
然后,根据计算的波特率值进行USARTx_BRR寄存器编程。
《软件和硬件方法设置》
此设置示例使用的是内置硬件自动波特率检测功能的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详细说明了软件方法。
4、误差计算
图 2显示ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。
不过,由于预期波特率与实际波特率之间的误差小于1%,因此所有模式的结果均正常。
图 3显示在通常情况下,当由72 MHz系统时钟为USART提供时钟(HSE作为PLL时钟源)时,结果优于USART时钟源使用HSI时钟。这要归因于HSI的相对不准确性。
图 4显示在大多数情况下,硬件方法提供的结果优于软件方法。不过,在某些情况下,软件方法能够提供相比于使用硬件方法时更好的结果。
图 5显示:
•使用硬件方法时,达到最大波特率9 Mbits/s时误差为0%。
•使用软件方法时,达到最大波特率时误差为约30%,这要归因于执行中断处理程序所花费的CPU周期。
《结论》
此应用笔记描述了某些STM32器件内置的硬件自动波特率检测功能。它还提供了在软件中实现此功能的技术,作为STM32器件没有在硬件中实现此功能的解决方案。
尽管示例中的自动波特率检测均应用在示例的开头部分,但是可以进行扩展并在每次发送和接收设备检测到通信错误时使用。当主机使用不同波特率进行通信时,这一特性可实现应用的稳健性。
审核编辑 :李倩
-
通信
+关注
关注
18文章
6032浏览量
135993 -
STM32
+关注
关注
2270文章
10900浏览量
356012 -
USART
+关注
关注
1文章
195浏览量
30857
原文标题:STM32的USART自动波特率检测
文章出处:【微信号:airX嵌入式,微信公众号:airX嵌入式】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论