STM32 使用 DMA 多通道 ADC 采样时,如何避免数据错位并精确对应各通道?

· 1 浏览

回答(4)

注意ADC的DMA请求是每个转换结束触发一次,不是一组结束,所以缓冲区索引会递增,只要缓冲区大小匹配通道数,循环模式下索引自动回绕,不会错位。
硬件工程师李工 · 2026-08-27
配置ADC时,将通道顺序写在规则序列寄存器里,DMA缓冲区大小设为通道数,每次转换完自动按序存储,索引即通道号,无需额外处理。
STM32小白 · 2026-08-27
用DMA的循环模式+双缓冲,在传输完成中断里切换缓冲区,这样读取时数据稳定,不会错位。记得在中断里先关DMA再切换。
嵌入式老张 · 2026-08-27
确保DMA多通道ADC数据不错位的核心是配置好ADC的通道扫描顺序和DMA的缓冲区映射。首先,在ADC初始化时,将所需通道按顺序加入扫描序列(如CH0、CH1、CH2),并设置DMA为循环模式,数据宽度为半字(16位),缓冲区大小等于通道数。DMA会将每次转换结果按扫描顺序依次存入缓冲区,因此缓冲区索引0对应第一个通道,索引1对应第二个,以此类推。为避免错位,需在每次DMA传输完成中断(或半传输中断)中读取数据,并确保在读取前DMA已完整写入一组数据。建议使用双缓冲或乒乓缓冲,在DMA传输完成时切换缓冲区,防止读取时数据被覆盖。另外,若使用注入通道或规则组,需注意规则组转换顺序与DMA映射一致。实操中,可先固定采样顺序,用已知电压验证各通道对应关系,再调整代码。最后,注意ADC时钟和采样时间设置,避免转换溢出导致数据丢失。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换