当前位置: 代码迷 >> 综合 >> STM32 CUBEMX UART+DMA
  详细解决方案

STM32 CUBEMX UART+DMA

热度:28   发布时间:2024-01-19 09:43:06.0

参考
https://blog.csdn.net/xukao5671927/article/details/78605022
http://www.51hei.com/bbs/dpj-39885-1.html
官方参考手册

小发现:
USART1_IRQHandler中的

void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */uint32_t tmp_flag = 0;uint32_t temp;/* USER CODE END USART1_IRQn 0 */    HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */tmp_flag =  __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);if((tmp_flag != RESET)){__HAL_UART_CLEAR_IDLEFLAG(&huart1);/* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */temp = huart1.Instance->SR;/* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */temp = huart1.Instance->DR;HAL_UART_DMAStop(&huart1);/* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */temp  = hdma_usart1_rx.Instance->NDTR;rx_len =  BUFFER_SIZE - temp;recv_end_flag = 1;}/* USER CODE END USART1_IRQn 1 */
}

__HAL_UART_CLEAR_IDLEFLAG(&huart1);是这样一个宏函数

     #define __HAL_UART_CLEAR_PEFLAG(__HANDLE__) \do{                                           \__IO uint32_t tmpreg = 0x00U;                \tmpreg = (__HANDLE__)->Instance->SR;        \tmpreg = (__HANDLE__)->Instance->DR;        \UNUSED(tmpreg);                             \} while(0U)

        /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */temp = huart1.Instance->SR;/* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */temp = huart1.Instance->DR;

功能相同,故将函数注释掉。重新烧录,程序正常运行