根源在于DMA配置与ADC扫描顺序不匹配。多路ADC使用扫描模式时,DMA按通道顺序(如ADC1_IN0→IN1→IN2)连续搬运,若DMA缓冲区大小不是通道数的整数倍,或未在每次转换完成时重置DMA指针,就会导致数据错位。实操建议:1) 将DMA设置为循环模式,缓冲区大小设为通道数×采样次数(如3通道×100次=300个半字),确保每次DMA传输周期与ADC扫描周期对齐;2) 在DMA传输完成中断中,通过读取DMA当前数据指针(DMA_GetCurrDataCounter)判断缓冲区写入位置,用环形索引(如idx = (DMA_GetCurrDataCounter() / 通道数) % 采样次数)来定位最新数据;3) 若使用双缓冲,切换时需同步ADC的EOC标志,避免读取半新半旧数据。环形缓冲对齐技巧:将缓冲区大小设为2的幂(如256),用位与操作(& (size-1))代替取模,提高效率;同时,在DMA配置中设置数据宽度为半字(16位),与ADC分辨率匹配,防止字节错位。
mcuku 阿沐 · 2026-08-27