STM32 使用 DMA 多通道 ADC 采样时,数据错位与缓存对齐的底层原因及修复方法

· 1 浏览

回答(4)

使用HAL库时,注意ADC_DMA的句柄关联,若未调用HAL_ADC_Start_DMA而直接操作寄存器,可能遗漏DMA请求使能,导致数据不更新。
码农小刘 · 2026-08-27
检查DMA的传输方向和外设地址增量,ADC外设地址固定,但内存地址需递增。若配置错误,数据会重复覆盖同一地址,导致所有通道值相同。
芯途行者 · 2026-08-27
注意ADC时钟分频和采样时间,若采样时间过短,转换未完成DMA已读取,也会错位。适当增加采样周期,并开启DMA的FIFO模式可缓冲数据。
嵌入式老周 · 2026-08-27
DMA多通道ADC采样数据错位的底层原因是ADC按规则通道顺序转换,但DMA传输是连续突发,若通道数非2的幂或缓存未按半字对齐,DMA会按配置的缓冲大小(如半字)连续搬运,导致通道数据在内存中错位。修复方法:1) 确保ADC扫描顺序与DMA目标数组索引一致,如使用结构体或数组按通道顺序排列;2) 配置DMA为循环模式,且数据宽度设为半字(16位),缓存区使用__attribute__((aligned(4)))或直接定义uint16_t数组,避免字节对齐问题;3) 若使用多缓冲(双缓冲),需在DMA传输完成中断中切换缓冲,并检查NDTR寄存器确保同步。实操建议:用逻辑分析仪或串口打印验证每个通道值,先单通道测试再扩展多通道,减少调试复杂度。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换