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

· 1 浏览

回答(4)

若用HAL库,检查ADC_DMAConvCpltCallback中是否及时清除标志,并考虑使用DMA的FIFO模式(如F4)来缓冲突发数据,减少总线竞争。
码农阿杰 · 2026-08-27
注意ADC校准(CAL)和采样时间设置,不同通道采样时间差异会导致时序偏移,可统一采样时间或按需调整DMA触发点。
芯海拾贝 · 2026-08-27
建议使用双缓冲(DMA双缓冲模式),交替存储两组数据,在中断中切换处理,可彻底避免读写冲突,尤其适用于高频采样。
嵌入式老周 · 2026-08-27
核心方案:使用DMA的循环模式(Circular Mode)配合ADC的扫描模式(Scan Mode),并确保DMA配置为半字(Half-word)传输以匹配ADC数据寄存器(16位)。关键点:1)将DMA的缓冲区大小设为通道数×采样次数,且每次转换完成触发DMA请求;2)在DMA传输完成中断(TC)或半传输中断(HT)中处理数据,避免主循环读取时缓冲区被覆盖;3)若需精确时序,可启用ADC的DMA请求在每次转换结束(EOC)时触发,而非序列结束(EOS),并设置DMA的FIFO或直接模式(Direct Mode)以降低延迟。实操建议:初始化时先配置ADC(扫描、连续或单次模式),再配置DMA(外设地址固定为ADC->DR,内存地址递增),最后使能DMA和ADC。若数据错位,检查DMA的传输宽度是否与ADC数据对齐,并确认ADC的DMA请求映射(如STM32F4需在ADC_CR2中设置DDS位)。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换