STM32 使用 DMA 进行多路 ADC 采样时,如何避免数据错位并保证通道顺序稳定?

· 2 浏览

回答(4)

调试技巧:在DMA中断中打印缓冲区首地址和当前索引,对比实际波形。若顺序错位,可尝试调整DMA的‘数据宽度’为32位(对齐到32位),但需注意内存占用。
码农阿飞 · 2026-08-27
注意:ADC的校准(CALIB)必须在启动DMA前完成,否则首次转换可能产生偏移。另外,若使用多ADC交替采样,需配置外部触发同步,否则通道顺序会乱。
芯海拾贝 · 2026-08-27
补充:开启DMA的‘循环模式’后,缓冲区地址会自动回绕,但需在中断中复制数据到用户数组,避免主循环读取时被覆盖。建议用双缓冲(ping-pong)结构,提高实时性。
嵌入式老周 · 2026-08-27
核心方案是采用DMA的循环模式(Circular Mode)配合ADC的扫描模式(Scan Mode),并确保DMA传输的数据宽度与ADC数据寄存器(如16位)一致。配置时,将DMA的缓冲区大小设为通道数(如4路则设4个uint16_t),并开启DMA传输完成中断(半传输和全传输)来分帧处理数据。为避免错位,必须保证ADC的通道序列(如CH0-CH3)与DMA缓冲区索引严格对应,且禁止在DMA传输过程中修改ADC配置。实操建议:1) 使用HAL库时,调用HAL_ADC_Start_DMA()后,在HAL_ADC_ConvCpltCallback中按固定索引读取缓冲区;2) 若需更高稳定性,可启用ADC的DMA请求的‘循环’特性,并设置DMA的FIFO模式(若支持)来缓冲数据;3) 关键点:不要依赖单次转换完成标志,而是用DMA的传输完成事件来同步,因为DMA搬运是连续的。若出现错位,检查DMA的通道优先级和ADC的采样时间是否足够,避免因转换未完成导致数据覆盖。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换