关注+星号公众号,不容错过精彩
作者:HywelStar
本章节将简单讲述关于串口波特率自适应相关内容。
本章节主要以硬件支持内容为主。
你将可以获取以下知识点:
串口波特率自适应在哪些芯片能够使用?
串口波特率自适应的原理是什么?
串口波特率自适应适合在什么场景上使用?
串口波特率自适应的准确率怎样?为什么有差异?
1. STM32 MCU支持列表
STM32 串口波特率自适应目前支持部分,不是所有都是支持。
需要注意的是:虽然某个系列的MCU 支持串口波特率自适应,并不说它所有的串口都支持,很多是某个或者某几个支持。具体可以查询列表。
2. STM32 串口波特率自适应
2.1 波特率自适应原理
不同的波特率,对于接收到相同数据的波形宽度不一样,每一个bit 位的所需要的时间都不一致。根据这点可以大概率判断出当前波特率的情况。
比如:图中的一个数据,1个起始位,7个数据位,1一个停止位。对于115200
,1200
不同波特率,这个数据所占的占空比完全不一致。
注意:检测波特率是需要接收到数据才能检测到,没有数据是不能检测当前对方的波特率为多少!
2.2 波特率自适应模式
STM32 中存在4种模式:
模式0:在起始位是1 这种进行检测。假如接收的数据都是第一位为0(1x),是无法检测出波特率。
模式1:起始带有10xx 这种数据,开始会检测波特率。
模式2:数据接收0x7F ,进行检测波特率。
模式3:数据接收0x55,进行检测波特率。
以上这么多种模式,对于最后两种来说,需要有交互,对方需要有发送这种字符才可以检测,范围 缩小。
2.3 波特率自适应检测错误率
对于准确率主要有两个方面影响,一个是模式选择,另外是对方当前波特率
fCK = 72 MHz时ABR的误差计算,115200 bits/s预期波特率。可以发现模式2和模式3错误率低,因为检测的位数更多,出错率更小。
对于相同模式下,波特率越高,一搬来说错误率也就会高,但57600
错误率比38400
低。
3. STM32 串口波特率自适应使用
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;
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();
}
3.1 模式选择
与对方串口没有交互的过程,首选mode0
或mode1
;
假如与对方串口可以自身定义,设定交互内容,选择mode3
和mode4
因为准确率高;
对于对速度要求不高,建议不要选择过高波特率,因为一般来说波特率越高,错误率也越高。
3.2 应用例子
关于波特率自适应,STM32 官方通过串口升级设备,就有这个部分,检测波特率,采用了模式2, 有兴趣可以查看。
https://sourceforge.net/projects/stm32flash
4. 总结
对于串口波特率自适应内容大概简单讲述,对于基本原理和使用有大致了解,什么情况下选择不一样的模式。关于官方的资料可以参考:
https://www.st.com/resource/en/application_note/dm00327191-stm32-usart-automatic-baud-rate-detection-stmicroelectronics.pdf
这里需要想一下:假设当已经检测对方波特率为115200
, 在中途中对方已经改为57600
, 本地是否能检测出?