根因:ADC多通道采样时,若DMA配置为循环模式且数据宽度与ADC分辨率不匹配(如12位数据存于16位寄存器),或未正确设置DMA的缓冲大小与通道数对应关系,会导致数据错位。典型错误是DMA传输长度设为通道数×采样次数,但未考虑ADC的EOC(转换结束)时序,导致DMA在最后一次转换完成前提前触发,或缓冲索引未按通道对齐。实操建议:1) 确保DMA的PeripheralDataSize和MemoryDataSize均为HalfWord(16位),且MemoryInc设为Enable;2) 使用DMA的循环模式,并设置缓冲大小为通道数×采样次数(如3通道×100次=300个HalfWord);3) 在DMA传输完成中断中,通过读取ADC的DR寄存器或使用双缓冲(DMA半传输/全传输中断)来同步数据索引,避免覆盖。环形缓冲设计:定义结构体数组,每个元素含通道ID和采样值,使用写指针(DMA中断更新)和读指针(主循环消费),当写指针追上读指针时丢弃旧数据。建议使用DMA的HalfTransfer和TransferComplete回调,分别处理前后半缓冲,确保数据连续性。
mcuku 阿沐 · 2026-08-27