STM32H7串口DMA空闲中断数据采集异常代号问题描述原因解决方法代号主机STM32H7单片机从机其他串口模块固定频率盲发输出问题描述主机和从机通过串口进行通信主机串口使用DMA空闲中断进行数据接收从机定时发数据给主机。现在主机先启动从机后启动串口接收异常主机后启动从机先启动开始工作异常从机端重启后主机串口工作又异常了串口中断无法响应原因STM32H7 的 USART 一旦出现 ORE溢出错误硬件会永久停止向 DMA 发请求并关闭串口中断 而其他模块上电 瞬间噪声 / 毛刺 → 极易触发 ORE 。 OREOverrun Error是 串口收到新字节但RDR 寄存器 / 硬件 FIFO 里的旧数据还没被 DMA 搬走的情况。 且必须 手动清除 ORE 标志硬件才会恢复工作 。解决方法调用 HAL_UART_ErrorCallback 在其中实现清异常标志位以及重启串口接收 。// An highlighted blockvoidUART_DMA_Restart(UART_HandleTypeDef*huart,uint8_t*buf,uint16_tlen){// 1. 停止 DMAHAL_UART_DMAStop(huart);// 2. 【核心】强制清除所有硬件错误标志H7 必须手动清__HAL_UART_CLEAR_FLAG(huart,UART_FLAG_ORE|UART_FLAG_FE|UART_FLAG_NE|UART_FLAG_RXNE|UART_FLAG_IDLE);// 3. 禁用再启用 UART 硬件彻底解锁状态机__HAL_UART_DISABLE(huart);__HAL_UART_ENABLE(huart);// 4. 重新启动 DMAHAL_UARTEx_ReceiveToIdle_DMA(huart,buf,len);}voidHAL_UART_ErrorCallback(UART_HandleTypeDef*huart){if(huart-InstanceUART8)// 串口{// 出错直接重启UART_DMA_Restart(huart8,uart_handle[COM_UART8].p_rx_buf,UART_BUF_SIZE);}else{}}