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

· 2 浏览

回答(4)

补充:时序一致性还可通过DMA的FIFO模式(如F4系列)设置阈值,减少总线冲突,但需注意FIFO会延迟数据,需根据采样率权衡。
码农小刘 · 2026-08-27
补充:若通道数较多,可考虑使用ADC的注入组配合DMA,但更推荐用规则组+双缓冲,简单可靠。
芯火燎原 · 2026-08-27
补充:使用HAL库时,注意在DMA传输完成回调中调用HAL_ADC_Stop_DMA再Start_DMA来复位,避免FIFO残留导致错位。
嵌入式老张 · 2026-08-27
核心思路是使用ADC的DMA循环模式配合双缓冲(或环形缓冲区),并利用ADC的EOC(转换结束)和DMA的传输完成中断来同步数据。首先,配置ADC为扫描模式+连续转换,DMA设置为循环模式,数据宽度与ADC寄存器匹配(如16位)。为避免多通道数据错位,必须确保DMA传输的数据块大小等于通道数(如4通道则每次传输4个半字),并在DMA传输完成中断中通过标志位(如半传输/全传输)切换缓冲区,这样每次中断时缓冲区内的数据就是完整的一轮采样。同时,在启动DMA前清零ADC的DR寄存器,并确保DMA的地址递增与ADC通道顺序一致。时序一致性方面,建议使用定时器触发ADC转换(如TIM1的TRGO),这样采样频率固定,DMA搬运节奏稳定。若使用连续转换,需注意CPU读取缓冲区时可能覆盖未处理数据,因此务必采用双缓冲机制。实操中,可先初始化DMA并开启中断,再启动ADC,并在中断中拷贝数据或置标志,主循环处理。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换