先确认现象是否与Cache相关:在DMA缓冲区前后加哨兵值,若错乱数据呈现旧值/部分新值,基本可判定为一致性缺失。排查步骤:1) 用SCB_InvalidateDCache_by_Addr/SCB_CleanDCache_by_Addr检查调用地址是否32字节对齐、长度是否按行向上取整;2) 区分方向:外设→内存(DMA写)在启动DMA前Invalidate,DMA完成中断里再Invalidate后读;内存→外设(DMA读)在启动DMA前Clean,完成后无需Invalidate;3) 双向DMA必须Clean+Invalidate,且顺序不能反;4) 中断里先清DMA标志再操作Cache,避免竞态;5) 缓冲区避免与栈/全局变量共享Cache行,用__attribute__((aligned(32)))并留padding。修复建议:优先把DMA缓冲区放到MPU配置为Non-Cacheable的RAM区(如SRAM4/D2域),从根上消除一致性问题;若必须用Cacheable区,封装DMA收发API统一做Clean/Invalidate,禁止业务层直接操作。最后用DMA双缓冲+计数器压力测试验证。