核心思路:用双缓冲时,DMA半传输/传输完成中断切换缓冲区,但指针错位常因中断延迟或DMA配置不当。实操建议:1) 使用DMA的循环模式,并配置半传输中断(HT)和传输完成中断(TC),在中断中切换当前有效缓冲区索引(如buf_index ^= 1),确保主循环只读取非活动缓冲区。2) 关键:在中断服务函数中,先读取DMA的CNDTR寄存器(剩余数据量)来确认当前DMA正在写入哪个缓冲区,避免因中断延迟导致索引与实际写入不符。3) 使用内存屏障(__DMB())或volatile修饰缓冲区索引,防止编译器优化。4) 若采样率极高,可考虑使用双缓冲+乒乓切换,并确保主循环在切换前完成数据处理,必要时用互斥锁或关中断保护。5) 验证DMA配置:确保外设地址、内存地址递增、数据宽度一致,且缓冲区大小对齐。最后,建议在调试时用逻辑分析仪观察DMA的传输完成信号,对比实际数据序列,定位错位点。
mcuku 阿沐 · 2026-08-27