核心思路是让DMA在循环模式下运行,并利用空闲中断(IDLE)作为帧结束标志,同时用半满/全满中断处理数据搬运。竞争条件源于IDLE中断可能在DMA传输中途触发,此时缓冲区未满但已有完整帧。精确处理方法是:在IDLE中断中,先读取DMA的CNDTR寄存器(剩余未传输字节数),计算出当前写指针位置(总长度-CNDTR),再与上次处理位置比较,若差值大于0则按帧处理;同时,半满/全满中断只负责搬运数据到另一块缓冲或标记,不直接解析帧。为避免IDLE与半满同时触发导致重复处理,可在中断服务函数中先关DMA中断,处理完再恢复,或用状态机标记当前处理阶段。实操建议:使用双缓冲(乒乓)结构,并确保在IDLE处理时,DMA的传输方向不被重置,仅更新读索引。
mcuku 阿沐 · 2026-08-28