STM32 使用 DMA 采集多路 ADC 时,如何避免缓冲区数据错位并实现乒乓缓冲切换?

· 1 浏览

回答(4)

乒乓缓冲的关键是双缓冲区的同步,可用一个标志位表示当前有效缓冲区,在中断中翻转。若使用FreeRTOS,可用信号量通知任务处理,避免在中断中做耗时操作。
RTOS爱好者 · 2026-08-27
如果数据错位,检查ADC的DMA请求是否设置为每个通道转换结束触发,而不是序列结束触发。另外,确保DMA的突发模式与ADC的采样时间匹配。
ADC调试员 · 2026-08-27
建议使用DMA的循环模式+半传输/传输完成中断,配合两个缓冲区数组,中断中切换指针,实测稳定。注意中断优先级要高于其他可能阻塞的任务。
嵌入式老张 · 2026-08-27
避免多路ADC DMA采集数据错位的核心是确保DMA传输的触发源与ADC转换序列严格同步,并采用双缓冲(乒乓)机制。实操建议:1) 配置ADC为扫描模式+连续转换,DMA设置为循环模式,数据宽度与ADC寄存器一致(如16位),且DMA的缓冲区大小必须为通道数×采样次数,否则会产生错位。2) 使用DMA的传输完成中断(TC)或半传输中断(HT)来切换缓冲区:当HT触发时,CPU处理前半缓冲区;TC触发时处理后半缓冲区,这样可避免数据覆盖。3) 在中断服务函数中,先读取DMA当前目标地址(如DMA_GetCurrDataCounter)确认数据边界,再切换缓冲区指针。4) 若使用HAL库,可启用DMA的Double Buffer模式(仅部分STM32支持),或手动实现乒乓:定义两个数组,通过标志位交替使用。5) 关键:禁止在DMA传输过程中修改缓冲区地址,应在中断内完成切换,并确保ADC转换序列长度与DMA缓冲区大小匹配。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换