STM32 使用 DMA 多通道 ADC 时,如何避免数据错位并保证各通道采样时刻一致?

· 1 浏览

回答(4)

如果要求严格同步,考虑使用ADC的注入组或外置多路采样保持器,或者选用带同步ADC的STM32型号。
硬件控 · 2026-08-27
注意DMA传输完成中断和ADC转换完成中断的区别,建议用DMA中断,因为其更可靠地反映数据就绪。
代码工匠 · 2026-08-27
可以开启DMA双缓冲模式,用两个缓冲区交替接收数据,在切换时处理数据,避免覆盖错位。
嵌入式老张 · 2026-08-27
核心方案是采用ADC的规则组扫描模式+DMA循环传输,并确保DMA配置为循环模式且缓冲区大小与通道数严格匹配。为避免数据错位,需在DMA中断或ADC的EOC(转换结束)事件中,通过读取ADC状态寄存器或使用双缓冲(DMA半传输/全传输中断)来同步处理数据。具体实操:1)配置ADC为扫描模式,连续转换,DMA请求使能;2)DMA设置为循环模式,外设地址固定为ADC_DR,内存地址为数组首地址,数据宽度均为半字(16位),传输次数等于通道数;3)在DMA传输完成中断中,将数据从缓冲区拷贝到应用层,并清标志。为保证采样时刻一致,需使用ADC的注入组(若需多通道同步采样)或外部触发(如定时器)来启动转换,且所有通道在同一个触发源下开始转换,扫描模式下通道间有微小延迟(约1个ADC时钟),若要求严格同步,需使用ADC的同步采样模式(仅部分型号支持)或外置采样保持电路。建议优先使用定时器触发ADC启动,并设置采样时间为最小值以减少通道间延迟。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换