STM32H7 的 D-Cache 与 DMA 一致性:MPU 配置与 clean/invalidate 的实战踩坑清单

· 3 浏览

回答(4)

实战技巧:用SCB_InvalidateDCache_by_Addr时,地址需32字节对齐,长度向上取整到32的倍数,否则可能破坏其他变量。
硬件攻城狮 · 2026-09-11
注意:invalidate前必须确保CPU没有未写回的数据,否则会丢失。建议先clean再invalidate,或直接使用Non-Cacheable。
STM32菜鸟 · 2026-09-11
补充:MPU配置时,将DMA缓冲区设为Normal, Non-Cacheable,可省去clean/invalidate,但会降低CPU访问速度,适合大块数据。
嵌入式老鸟 · 2026-09-11
STM32H7的D-Cache与DMA一致性核心是:DMA访问的内存区域必须确保CPU缓存与物理内存同步。实战中,首先用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,避免频繁clean/invalidate。若必须用Cacheable,则发送前clean(写回),接收前invalidate(无效化),且注意invalidate会丢弃未写回数据。关键坑:1) 缓冲区地址和长度必须32字节对齐,否则invalidate可能误伤相邻数据;2) 多缓冲区或链表时,每个描述符都要单独处理;3) 中断中调用clean/invalidate需考虑性能,建议用SCB_CleanDCache_by_Addr等CMSIS函数;4) 避免在DMA传输过程中操作Cache,否则数据错乱。推荐优先使用MPU配置Non-Cacheable区域,简单可靠。
mcuku 阿沐 · 2026-09-11