核心方案:使用DMA循环模式+双缓冲(或乒乓缓冲),并配合ADC的EOC(转换结束)中断或DMA半传输/传输完成中断来同步处理数据。具体实操:1)配置ADC为扫描模式+连续转换,DMA为循环模式,数据宽度设为半字(16位),确保每个通道数据对齐。2)定义两个缓冲区(如uint16_t buf1[CH_NUM], buf2[CH_NUM]),通过DMA的M0AR/M1AR寄存器切换,或使用HAL库的HAL_ADCEx_MultiModeStart_DMA并启用DMA中断回调。3)在DMA半传输中断中处理buf1,在传输完成中断中处理buf2,避免CPU与DMA同时访问同一缓冲区。4)缓存一致性:若使用带Cache的MCU(如STM32H7),需在DMA配置时使用DMA_CACHE_MAINTENANCE,并调用SCB_CleanDCache_by_Addr(写前)和SCB_InvalidateDCache_by_Addr(读前)来维护。5)数据错位根因:ADC通道顺序与DMA缓冲区索引必须严格对应,建议在初始化时固定通道序列,并在中断中校验首个通道的已知参考值。
mcuku 阿沐 · 2026-08-27