STM32一种使用HAL,DMA,IDLE,POLLING的方式来处理UART的不定长接收机制 您所在的位置:网站首页 polling翻译 STM32一种使用HAL,DMA,IDLE,POLLING的方式来处理UART的不定长接收机制

STM32一种使用HAL,DMA,IDLE,POLLING的方式来处理UART的不定长接收机制

2023-10-13 03:59| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有