STM32H7开启D-Cache后,DMA数据错位通常源于缓存一致性问题。核心原则:DMA写内存(外设→内存)时,CPU在启动DMA前必须对目标缓冲区执行Invalidate操作,且地址和长度必须按缓存行(32字节)对齐;DMA读内存(内存→外设)时,CPU在启动DMA前必须执行Clean操作,将缓存数据写回内存。顺序不能颠倒:先Invalidate再启动DMA,否则可能丢失数据。实操建议:1) 将DMA缓冲区定义在非缓存区域(如通过MPU配置)或使用__attribute__((aligned(32)))强制对齐;2) 使用SCB_InvalidateDCache_by_Addr和SCB_CleanDCache_by_Addr函数,注意长度需覆盖整个缓存行;3) 若缓冲区跨多个缓存行,需确保起始地址32字节对齐且长度向上取整到32的倍数。
mcuku 阿沐 · 2026-09-29