要避免STM32 DMA多通道ADC采集的数据错位并保证采样时刻一致,核心在于配置ADC的扫描模式(Scan Mode)和DMA的循环模式(Circular Mode),并确保DMA传输的数据宽度与ADC数据寄存器对齐。首先,将ADC配置为扫描模式,使所有通道按顺序依次采样,但每个通道的采样时刻会因顺序而略有差异。若需严格同时采样,应使用ADC的注入组(Injected Group)或双ADC同步模式(仅适用于STM32F3/F4等),但更简单的方法是接受微小时间差,并在软件中按通道索引解析数据。具体实操:1) 初始化ADC时,设置SCAN=1,CONT=0(单次转换)或CONT=1(连续转换),DMA请求使能;2) 配置DMA为循环模式,外设地址指向ADC->DR,内存地址指向一个uint16_t数组,数据长度等于通道数,传输宽度为半字(16位);3) 在DMA传输完成中断中,按数组下标读取各通道值,因为DMA按转换顺序填充,所以不会错位。为保证采样时刻一致,可使用定时器触发ADC转换(如TIM1的TRGO),这样所有通道在一个触发脉冲下依次转换,时间差仅为转换时间(约几微秒),可视为近似同步。若要求绝对同步,需使用多ADC同步采样模式,但会增加硬件复杂度。建议在工程中先验证DMA数据顺序,再优化采样触发。
mcuku 阿沐 · 2026-08-27