赞
踩
1.前言
使用串口接收不定长数据时,可以有多种方法,比如最常见的有额外使能一个定时器,在超过定时范围未收到后续的字节时,认为此帧结束;或者利用IDLE中断,当数据空闲时,自动产生中断;亦或每接收到一个字节后都通过应用程序进行一次处理。这次我们介绍另外一种方法,在DMA方式下利用硬件接收超时中断(Receiver timeout interrupt)实现不定长数据的接收。
2.实现原理
首先,并非所有的STM32系列的MCU,也并非所有的USART/UART外设都支持Receiver timeout(RTO)特性,具体的支持情况,可以通过对应芯片的参考手册去查询。对于MCU的配置,可以通过USART_RTOR寄存器的RTOEN位使能接收超时功能,通过RTO位域配置超时时间,时间单位为传输一个数据位的时间(即波特率)。接收超时在停止位设置不同的情况下,计时的起始位置不同:
当计数超过 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);
HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart);
以STM32U575ZIT6为例,配置一个测试工程。
生成工程后,配置超时时间,使能接收超时功能,使能串口的DMA接收,处理串口的错误回调函数(接收超时后,HAL库中经HAL_UART_ErrorCallback()回调)。
- /* USER CODE BEGIN 2 */
-
- HAL_UART_ReceiverTimeout_Config(&huart1, huart1.Init.BaudRate/100); //10ms BaudRate = 115200
-
- HAL_UART_EnableReceiverTimeout(&huart1);
-
- HAL_UART_Receive_DMA(&huart1, Uart_RcvBuf, MAX_UART_RCV_LEN);
-
- /* USER CODE END 2 */
-
-
-
-
- #define MAX_UART_RCV_LEN 10 //config the max receive data length
-
- uint8_t Uart_RcvBuf[MAX_UART_RCV_LEN];
-
- uint16_t Uart_RcvLen;
-
- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
-
- {
-
- if(huart == &huart1)
-
- {
-
- /* Check if DMA mode is enabled in UART */
-
- if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
-
- {
-
- if((huart->ErrorCode & HAL_UART_ERROR_RTO) == HAL_UART_ERROR_RTO)
-
- {
-
- uint16_t nb_remaining_rx_data = (uint16_t)
-
- __HAL_DMA_GET_COUNTER(huart->hdmarx);
-
- Uart_RcvLen = MAX_UART_RCV_LEN - nb_remaining_rx_data;
-
- }
-
- HAL_UART_Receive_DMA(&huart1, Uart_RcvBuf, MAX_UART_RCV_LEN);
-
- }
-
- }
-
- }
HAL_UART_ErrorCallback 是一个支持所有错误中断的回调函数,在处理RTO错误引起的中断响应时,可以通过 ErrorCode 增加相应的判断。通过调用__HAL_DMA_GET_COUNTER(huart->hdmarx)可以得到DMA未搬移完的字节数,从而得到已搬移完成的字节数。
4.总结
利用RTO方式接收不定长串口数据,相比用定时器计时,可以节省一个硬件定时器资源,同时减少了定时器每次进入中断处理的运行时间;相比IDLE的方式,可以更灵活的配置超时时间。但需注意的是,所选用的MCU以及所使用的USART/UART是否支持这个特性要确认好。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。