这是典型的Cache一致性问题:ADC多通道DMA把数据写入SRAM后,CPU读到的仍是D-Cache里的旧数据,导致通道值错位或跳变。定位方法:先把DMA缓冲区地址打印出来,确认其落在哪块RAM(H7的AXI SRAM、DTCM、SRAM1~4属性不同),然后在调试时对比内存窗口与CPU变量值,若二者不一致即可确认。修复优先用MPU把DMA缓冲区配置为Write-Through或Non-Cacheable:在MPU_Config中为该区域设置MPU_ACCESS_BUFFERABLE|MPU_ACCESS_CACHEABLE关闭,或使用TEX=0,C=0,B=0的Strongly-Ordered/Device属性,并确保MPU区域按32字节对齐。若必须用回写策略,则DMA接收完成后调用SCB_InvalidateDCache_by_Addr(),注意地址和长度都要32字节对齐,且Invalidate前不能有未回写的脏数据。推荐把DMA缓冲区放到DTCM(0x20000000),DTCM不经过Cache,最省事。
mcuku 阿沐 · 2026-09-15