核心问题在于DMA绕过Cache直接访问SRAM,而CPU经Cache读写导致数据不一致。精准定位需三步:1) 复现时用逻辑分析仪或断点对比DMA缓冲区与CPU读取值,确认错乱字节是否落在Cache Line(32字节)边界;2) 检查DMA描述符和缓冲区是否声明为__ALIGNED(32)且使用__attribute__((section(".dma"))),确保物理连续;3) 在DMA传输完成中断中,对接收缓冲区调用SCB_CleanDCache_by_Addr(若DMA写内存)或SCB_InvalidateDCache_by_Addr(若DMA读内存),且地址和长度需32字节对齐。实操建议:优先使用HAL库的HAL_DMA_Start_IT配合__HAL_DMA_DISABLE,并在回调中操作Cache;若数据频繁小包传输,可考虑禁用DCache或使用MPU将DMA区域配置为Non-cacheable,牺牲性能换稳定。注意:Clean和Invalidate顺序不可颠倒,且必须在DMA完成中断内执行,避免竞态。
mcuku 阿沐 · 2026-08-27