参考
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;
功能相同,故将函数注释掉。重新烧录,程序正常运行