1.前言
使用串口接收不定长数据时,可以有多种方法,比如最常见的有额外使能一个定时器,在超过定时范围未收到后续的字节时,认为此帧结束;或者利用IDLE中断,当数据空闲时,自动产生中断;亦或每接收到一个字节后都通过应用程序进行一次处理。这次我们介绍另外一种方法,在DMA方式下利用硬件接收超时中断(Receiver timeout interrupt)实现不定长数据的接收。
2.实现原理
首先,并非所有的STM32系列的MCU,也并非所有的USART/UART外设都支持Receiver timeout(RTO)特性,具体的支持情况,可以通过对应芯片的参考手册去查询。对于MCU的配置,可以通过USART_RTOR寄存器的RTOEN位使能接收超时功能,通过RTO位域配置超时时间,时间单位为传输一个数据位的时间(即波特率)。接收超时在停止位设置不同的情况下,计时的起始位置不同:
- 如果 stop = ' 00 '或 stop = ' 11 ',从停止位的末尾开始。
- 如果 stop = ' 10 ',则从第二个停止位的末尾开始。
- 如果 stop = ' 01 ',则从停止位的起始开始。
当计数超过 RTO 位域的设定值时,且使能了 RTOIE 位,就会产生一个错误中断,此时我 们就可以认为此帧结束,进而进行处理。
3.应用示例
HAL 库已经为我们提供了操作 RTO 相关的 API,应用开发过程,我们直接调用即可。
void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue);
HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart);
<
本文介绍了在STM32系列MCU的USART/UART模块上,利用硬件接收超时中断(RTO)实现接收不定长数据的方法,包括原理、应用示例和总结,强调了与定时器和IDLE方式相比的优势与注意事项。
最低0.47元/天 解锁文章
159

被折叠的 条评论
为什么被折叠?



