STM32 使用 DMA 多通道 ADC 时,如何避免数据错位并正确区分各通道结果?

· 1 浏览

回答(4)

若使用多ADC交替采样,需同步触发源,并考虑使用双DMA或定时器触发,否则通道间时间差会导致数据错位。
硬件小能手 · 2026-08-27
注意DMA的FIFO设置,若开启FIFO需确保阈值匹配,否则可能丢数据。建议关闭FIFO或设为半满,减少错位风险。
芯途行者 · 2026-08-27
可以启用ADC的注入通道或规则组排序,但更简单的是在DMA回调中按缓冲区索引直接读取,因为扫描模式下数据顺序固定为通道配置顺序。
嵌入式老张 · 2026-08-27
核心思路是使用ADC的扫描模式(Scan Mode)配合DMA的循环模式(Circular Mode),并确保DMA传输的数据宽度与ADC数据寄存器(如16位)一致。为避免错位,关键在于配置DMA的缓冲区大小等于通道数(如4通道则设4个16位变量),并启用DMA的半传输/传输完成中断,在中断中读取缓冲区。同时,需将ADC的DMA请求设置为循环模式,且DMA的存储器地址递增(Memory Increment)必须开启,外设地址固定为ADC->DR。实操建议:初始化时先配置DMA,再使能ADC;在中断中通过标志位或索引区分批次,防止读取时数据被覆盖。若使用HAL库,注意在ADC_Start_DMA前调用__HAL_ADC_ENABLE。另外,可增加一个软件同步标志(如每次DMA传输完成翻转一个GPIO),用于示波器验证时序。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换