你的设备需要连接到另一个设备,但不知道对方串口的波特率。如果能够自动识别波特率,会非常方便吧?
1. 概述
关于自动识别UART串口波特率的问题,有经验或者对串口有研究的朋友应该多多少少了解一些自动识别的方法。
目前最常见且有效的方法是通过软件编程来逐个尝试不同的波特率进行匹配。
这种通过软件来检测波特率的方法是最常见的,也是比较有效的方法。
除了通过软件,还有一种方法是通过串口硬件本身来完成波特率的检测。
对于STM32而言,ST官方在应用笔记和参考手册中有提到相关内容。下面我们结合文档来简单介绍硬件自动波特率检测的内容。
2. STM32硬件自动波特率检测
自动波特率检测(ABR: Auto Baud Rate)使接收设备能够接收来自不同速率工作的发送设备的数据,无需预先建立数据速率。
ABR适用于以下情况:
-
无法预先知道系统的通信速度。 -
系统使用的时钟源相对准确度较低,但该机制仍可以在不测量时钟偏差的情况下获得正确的波特率。
在STM32中,只有部分系列支持硬件自动波特率检测。早期推出的系列(如F1、F4)不支持该功能,而后续推出的系列都支持自动波特率检测,包括最新的STM32H7和G0系列。
当然,对于内置ABR的STM32系列设备而言,并非所有实例化USART接口均支持自动波特率检测。
3.自动波特率检测模式
ABR是指接收设备通过检查第一个字符(通常是预先选择的标志字符)确定传入数据速率的过程。
STM32产品上的自动波特率检测功能内置的各种模式基于不同字符模式:
模式0:以“1”位为开头的任意字符;
模式1:以10xx模式开头的任何字符;
模式2:0x7F;
模式3:0x55;
提示:
**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模式。
其中:
• 预期波特率取决于发送设备
• 实际波特率是USART接收器使用自动波特率检测操作确定的波特率。
6.误差
下图来自官方测试数据,基于:fCK = 72 MHz时ABR的误差计算,115200 bits/s预期波特率
从上图可以看出:ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。
不过,由于预期波特率与实际波特率之间的误差小于1%,因此所有模式的结果均正常。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !