串口波特率自适应用法

文摘   2024-07-05 18:40   广东  

关注+星号公众号,不容错过精彩

作者:HywelStar

本章节将简单讲述关于串口波特率自适应相关内容。

本章节主要以硬件支持内容为主。

你将可以获取以下知识点:

  • 串口波特率自适应在哪些芯片能够使用?

  • 串口波特率自适应的原理是什么?

  • 串口波特率自适应适合在什么场景上使用?

  • 串口波特率自适应的准确率怎样?为什么有差异?

平台:STM32系列单片机
我是你们的老朋友,@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 模式选择

与对方串口没有交互的过程,首选mode0mode1

假如与对方串口可以自身定义,设定交互内容,选择mode3mode4因为准确率高;

对于对速度要求不高,建议不要选择过高波特率,因为一般来说波特率越高,错误率也越高。

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, 本地是否能检测出?


码思途远
一位码农的日常分享,探索软件技术知识与新闻的数字十字路口。