处理STM32 DMA接收不定长串口数据时,空闲中断(IDLE)与帧超时(如字符间超时)冲突的核心在于明确触发时机和优先级。建议采用DMA+空闲中断方案:配置DMA循环模式接收数据到缓冲区,使能USART的IDLE中断。当一帧数据接收完毕(即总线空闲)时,IDLE中断触发,在中断服务程序中读取DMA剩余数据量(如DMA_GetCurrDataCounter),计算出本次接收长度,并立即处理数据。为避免与帧超时冲突,需注意:1)若使用定时器实现帧超时(如字符间超时),应在IDLE中断中禁用定时器,避免重复触发;2)若使用USART的RTO(接收超时)功能(STM32F4/F7/H7系列),需配置RTO时间大于最大字符间隔,且IDLE中断优先级高于RTO中断,确保帧结束由IDLE优先处理;3)在中断中快速拷贝数据并清标志,避免阻塞。实操建议:使用环形缓冲区管理DMA数据,IDLE中断只做标记和长度计算,主循环处理数据,可有效避免冲突。
mcuku 阿沐 · 2026-08-27