STM32一种使用HAL,DMA,IDLE,POLLING的方式来处理UART的不定长接收机制 | 您所在的位置:网站首页 › polling翻译 › STM32一种使用HAL,DMA,IDLE,POLLING的方式来处理UART的不定长接收机制 |
STM32一种使用HAL,DMA,IDLE,POLLING的方式来处理UART的不定长接收机制设备接收数据 (DMA) 采用的HAL库,同时在UART初始化的时候添加DMA相关操作,在系统开始运行时,开始使用HAL_UART_Receive_DMA来启动UART的接收,同时需要定义一个接收的bufferuartDeviceRxBuf,这个是设备的DMA BUFFER而uartRxBuf,是在接收完成后将设备里面的数据转移出来,并清空设备BUFFER来接收新的数据。定义如下 #define UART_BUF_LEN 100 uint8 uartDeviceRxBuf[UART_BUF_LEN] = {0}; uint8 uartRxBuf[UART_BUF_LEN] = {0}; //启动函数 void Bsp_Uart_Receive_Start(void) { HAL_UART_Receive_DMA(&huart1, uartDeviceRxBuf, UART_BUF_LEN); }设备数据转移至系统接收Buffer (IDLE)在开启UART接收数据之后,虽然DMA的中断已开启,但我们并不打算使用到DMA的中断,即不能等到接收完UART_BUF_LEN这个长度才去查看数据。如果说我们使用到了DMA的中断就说明很大概率数据已经发生了丢失。 使用UART的IDLE中断来接收当前接收到的数据,在收到数据之后,在停止接收数据时会产生一个IDLE中断,中断响应时,将DMA中的数据转移至uartRxBuf之中。 //初始化函数中添加这个操作 __HAL_UART_ENABLE_IT(uartHandle, UART_IT_IDLE);中断之中添加响应 HAL_UART_IDLE_Handler(&huart1);在中断之中去操作UART的DMA,先是将DMA中的数据读出,再重置UART的DMA,用于下一帧数据的接收 void HAL_UART_IDLE_Handler(UART_HandleTypeDef* uartHandle) { if(uartHandle->Instance == USART1) { if(__HAL_UART_GET_FLAG(uartHandle, UART_FLAG_IDLE) != RESET) { Bsp_Uart_Receive_Idle_Callback();//设备数据移至系统Buffer __HAL_UART_CLEAR_IDLEFLAG(uartHandle); // RESET RECEIVE DMA LENGTH // HAL_DMA_Abort(uartHandle->hdmarx); //不能直接用DMA Abort操作会导致HAL,API出错,导致接收不正常 HAL_UART_DMAStop(uartHandle); Bsp_Uart_Receive_Start(); } } } /********************************************************* *********************************************************/ uint16 Bsp_Uart_No_Receive_Data_Len(void) { uint16 result = 0; result = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); return result; } /********************************************************* *********************************************************/ void Bsp_Uart_Receive_Idle_Callback(void) { if(Bsp_Uart_No_Receive_Data_Len() |
CopyRight 2018-2019 实验室设备网 版权所有 |