在STM32的DMA+双缓冲接收不定长串口数据时,精准判断帧结束的核心是结合空闲中断(IDLE)和DMA传输完成中断,而非依赖半字中断。半字中断(Half Transfer)仅用于指示缓冲区半满,容易因数据长度不匹配而误触发,建议禁用或仅用于数据搬运。实操建议:1)配置UART的IDLE中断,在空闲中断中读取DMA剩余数据量(DMA_GetCurrDataCounter),计算本次接收长度,并切换缓冲指针;2)同时启用DMA传输完成中断(TC)用于处理缓冲区满的情况,但需在IDLE中断中优先处理,避免重复;3)在IDLE中断中,先关闭DMA(或禁用通道),读取剩余计数,再重新配置DMA基地址和长度,确保下一帧数据不覆盖;4)使用环形缓冲或双缓冲交替,避免数据竞争。注意:IDLE中断在帧间空闲时触发,需在中断服务函数中清除IDLE标志(先读SR再读DR)。
mcuku 阿沐 · 2026-08-27