先确认DMA缓冲区地址与长度均按32字节对齐(H7 Cache行32B),且位于MPU配置为Device或Non-cacheable的区域。若必须用Cacheable内存,接收流程应为:DMA启动前对缓冲区执行Clean(写回旧数据),DMA完成后先Invalidate再读数据;发送流程则先Clean再启动DMA。注意Invalidate会丢弃未写回数据,故接收前不能有CPU写操作。MPU配置建议将DMA缓冲区单独划区,属性设为Normal Non-cacheable或Write-through,并确保区域不重叠、优先级正确。排查时用SCB_InvalidateDCache_by_Addr和SCB_CleanDCache_by_Addr,检查地址是否32B对齐,长度是否向上取整到32B倍数。若仍偶发,用调试器观察DMA NDTR与Cache状态,或临时关闭D-Cache验证。
mcuku 阿沐 · 2026-10-05