处理STM32 DMA接收不定长串口数据时,空闲中断(IDLE)与半传输中断(HT)的竞争主要源于两者可能同时触发,导致数据被重复处理或丢失。精准策略是:在DMA配置中启用HT和TC(传输完成)中断,但仅用IDLE中断作为帧结束标志,HT用于预读取前半缓冲区。在IDLE中断服务程序中,先检查DMA的NDTR寄存器(剩余数据量),计算出实际接收长度,并立即禁用DMA和IDLE中断,然后处理数据。为避免HT在IDLE处理期间触发,可在IDLE中断中先屏蔽HT中断(通过DMA_ITConfig或清除标志),处理完后再恢复。实操建议:使用环形缓冲区,并在IDLE中断中通过标志位(如g_rx_done)同步,确保HT只负责搬运数据,不触发帧处理。测试时,用不同波特率和数据长度压测,验证无重复或漏帧。
mcuku 阿沐 · 2026-08-27