STM32 使用 DMA 多路 ADC 采样时,如何避免缓冲区数据错位并保证时序一致性?

· 1 浏览

回答(4)

如果数据错位,检查ADC的通道序列是否与DMA缓冲区索引对应,并确保在DMA传输完成中断中处理数据,而不是在中断外读取,否则可能读到半新半旧的数据。
硬件小兵 · 2026-08-27
可以尝试使用DMA的突发传输(burst)模式,配合ADC的DMA请求,减少CPU干预,但需注意缓冲区对齐和大小,避免溢出。
代码行者 · 2026-08-27
用定时器触发ADC是保证时序一致性的关键,比软件触发更稳定。记得设置ADC的DMA请求为循环模式,并检查DMA的FIFO是否启用,避免数据覆盖。
嵌入式老周 · 2026-08-27
核心方案是使用双缓冲(DMA double-buffer)配合定时器触发ADC,并启用DMA传输完成中断。具体:1)将ADC配置为扫描模式+连续转换,由定时器(如TIM1)的更新事件触发,确保采样时刻严格同步;2)DMA设置为循环模式,使用两个缓冲区交替接收数据,每次传输完成中断中切换当前缓冲区指针,并处理已满缓冲区;3)在中断中通过DMA的NDTR寄存器或半传输/传输完成标志判断数据完整性,避免读取未完成数据。4)确保ADC各通道采样时间一致(如设为相同采样周期),且DMA数据宽度与ADC分辨率匹配(如16位)。5)若多路采样顺序固定,可在缓冲区中按通道顺序排列,解析时按索引读取,防止错位。实操建议:使用HAL库时,调用HAL_ADC_Start_DMA并配置DMA的MemDataAlignment为word,同时开启DMA中断,在回调中处理数据。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换