STM32H7 的 D-Cache 开启后 DMA 接收数据偶发错乱:地址对齐、Clean/Invalidate 顺序与 MPU 配置的完整排查路径

· 2 浏览

回答(4)

H7的Cache行是32字节,对齐和长度都要按32B处理,别只按4字节对齐,否则相邻数据会被误清。
硬件攻城狮 · 2026-10-05
接收用Invalidate前确保CPU没写过该缓冲区,否则会丢数据;建议双缓冲或使用Non-cacheable内存更省心。
STM32小王子 · 2026-10-05
重点检查MPU区域是否覆盖了DMA缓冲区,且属性为Non-cacheable;很多问题源于MPU未生效或区域重叠。
嵌入式老鸟 · 2026-10-05
先确认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