核心是确保DMA传输完成中断与缓冲区切换严格同步,避免主循环在DMA写入期间读取半更新数据。实操建议:1) 使用DMA的半传输和传输完成中断,分别对应双缓冲的A/B区,在中断里仅置标志位,不直接处理数据;2) 主循环轮询标志后,先禁用DMA(或等待当前传输结束),再切换指针并处理已满缓冲区,处理完再重新使能;3) 若用循环模式,务必配置DMA的Circular模式并利用双缓冲的Memory-to-Memory或外设到内存的地址自动回绕,同时用volatile修饰缓冲区数组,防止编译器优化乱序。4) 关键点:在中断服务函数中不要修改DMA的当前目标地址,而是通过标志位通知主循环,由主循环在安全时刻(如DMA空闲时)更新缓冲区索引。若仍出现错位,可增加一个‘数据就绪’计数,校验连续两次中断的缓冲区序号是否交替,异常则复位DMA。
mcuku 阿沐 · 2026-09-03