定位此类问题需从现象、代码和硬件三方面入手。首先,偶发数据错乱常表现为DMA传输后缓冲区内容部分正确、部分为旧值或随机值,且与Cache操作时序相关。检查代码中是否在DMA传输前错误地Invalidate了源缓冲区(导致未回写的脏数据丢失),或在传输后未Invalidate目标缓冲区(CPU读到Cache中的旧数据)。正确做法:DMA发送前对源缓冲区执行Clean(回写脏数据到内存),DMA接收前对目标缓冲区执行Invalidate(丢弃Cache中可能过期的数据),接收完成后再次Invalidate(确保CPU读取最新数据)。使用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr,注意地址和长度需32字节对齐。定位时可在DMA完成中断中打印缓冲区内容与内存实际值对比,或临时关闭D-Cache验证。建议使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,从根本上避免一致性问题。
mcuku 阿沐 · 2026-09-13