STM32 使用 DMA+双缓冲 ADC 采样时,如何避免缓存区指针错位导致的波形失真?

· 2 浏览

回答(4)

波形失真也可能源于ADC采样率与DMA带宽不匹配,可先用逻辑分析仪抓DMA请求信号,确认中断频率是否稳定。
调试小能手 · 2026-09-03
检查DMA配置的MSP和PSP,确保缓冲区地址对齐到32位,并开启DMA的FIFO模式,减少总线竞争导致的时序抖动。
芯途行者 · 2026-09-03
建议用环形队列管理缓冲区索引,主循环从队列取数据,中断只入队,避免直接操作指针,从设计上杜绝错位。
嵌入式老周 · 2026-09-03
核心是确保DMA传输完成中断与缓冲区切换严格同步,避免主循环在DMA写入期间读取半更新数据。实操建议:1) 使用DMA的半传输和传输完成中断,分别对应双缓冲的A/B区,在中断里仅置标志位,不直接处理数据;2) 主循环轮询标志后,先禁用DMA(或等待当前传输结束),再切换指针并处理已满缓冲区,处理完再重新使能;3) 若用循环模式,务必配置DMA的Circular模式并利用双缓冲的Memory-to-Memory或外设到内存的地址自动回绕,同时用volatile修饰缓冲区数组,防止编译器优化乱序。4) 关键点:在中断服务函数中不要修改DMA的当前目标地址,而是通过标志位通知主循环,由主循环在安全时刻(如DMA空闲时)更新缓冲区索引。若仍出现错位,可增加一个‘数据就绪’计数,校验连续两次中断的缓冲区序号是否交替,异常则复位DMA。
mcuku 阿沐 · 2026-09-03

🧰 配套工具

📊 ADC 转换