STM32串口自动识别波特率的原理
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
1概述
关于自动识别UART串口波特率的这个问题,相信有项目经验,或者认真研究过串口的朋友都应该多多少少知道一点自动识别的方法。
可能绝大部分知道的就是通过通过软件编程让波特率一一匹配来实现,这种方法也是最常见,而且还比较有效的一种方法。
上面这种方法就是大家熟知的通过软件来检测波特率的方法,其实,还有一种方法就是通过串口硬件自身完成波特率来检测。
针对STM32,在ST官方其实在应用笔记和参考手册文档中都有提到。下面,我结合文档简单讲下硬件自动波特率检测的内容。
2STM32硬件自动波特率检测
ABR:Auto Baud Rate,自动波特率检测使接收设备能够接受来自各种以不同速率工作的发送设备的数据,无需事先建立数据速率。
1.ABR应用地方
事先不知道系统的通信速度。
系统正在使用精确度相对较低的时钟源且该机制允许在不测量时钟偏差的情况下获得正确的波特率。
2.支持ABR系列
在STM32中,支持硬件自动波特率检测的只有部门系列才支持,之前出来比较早的系列不支持(如F1 F4),这后面推出来的系列都支持这个功能,包含最新才出来的STM32H7、G0系列都支持。
当然,对于内置ABR的STM32系列设备而言,并非所有实例化USART接口均支持自动波特率检测。
提示:
A.在所有ABR模式下,都会在同步数据接收期间多次检测波特率,并将每一次的检测值与上一次的检测值进行比较。
B.在7位数据长度模式下,不支持0x7F和0x55帧检测ABR模式。
4.代码配置
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);
}
从上图可以看出:ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。
不过,由于预期波特率与实际波特率之间的误差小于1%,因此所有模式的结果均正常。
后台回复『STM32』『通信』阅读更多相关文章。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。