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

· 1 浏览

回答(4)

检查DMA配置时,注意数据宽度必须为半字(16位),因为ADC输出是12位。同时,确保ADC的DMA请求使能,否则数据不会自动搬运。
硬件调试员 · 2026-08-27
如果通道数多,建议用结构体数组组织数据,每个结构体包含各通道值,DMA直接写入结构体数组,代码更清晰,对齐更自然。
ADC小能手 · 2026-08-27
用DMA的Half-Transfer和Transfer Complete中断,分别处理前一半和后一半数据,可实现无缝双缓冲,避免数据覆盖。记得在中断里切换处理索引。
嵌入式老张 · 2026-08-27
精准对齐DMA多通道ADC数据的关键在于理解DMA传输的连续性和缓冲区的组织方式。首先,配置ADC为扫描模式(SCAN)并启用DMA循环模式(CIRC),将DMA缓冲区大小设为通道数×采样次数(例如3通道×100次=300个uint16_t)。DMA每次传输一个通道的转换结果,顺序与ADC通道序列(如CH0,CH1,CH2)严格一致,因此缓冲区中数据按周期排列:第0~2个元素对应第一次采样的CH0~CH2,第3~5个对应第二次,以此类推。为避免错位,务必在DMA传输完成中断(或半传输中断)中处理数据,此时缓冲区已完整填充一个批次。处理时,通过索引偏移(如i*通道数+通道号)提取各通道数据。若需连续采样,可启用双缓冲(DMA的Memory-to-Memory模式或使用两个缓冲区交替),并在切换时同步读取。实操建议:初始化时清零缓冲区,使用volatile修饰缓冲区变量,并在中断中先禁用DMA再拷贝数据,防止竞争。另外,确保ADC时钟和采样时间设置合理,避免转换溢出导致数据丢失。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换