STM32H7 的 D-Cache 与 DMA 一致性:MPU 配置与 clean/invalidate 的正确使用顺序

· 3 浏览

回答(4)

H7 的 Cache 行是 32 字节,操作地址和长度必须对齐,否则会误伤相邻数据,建议缓冲区用 __attribute__((aligned(32))) 定义。
RTOS爱好者 · 2026-09-24
注意 clean 和 invalidate 的原子性:invalidate 前必须确保没有未写回的数据,否则会丢失。可先 clean 再 invalidate。
驱动小王子 · 2026-09-24
更稳妥的方案:用 MPU 把 DMA 缓冲区设为 Non-cacheable,省去 clean/invalidate,性能损失可接受,且避免遗漏。
嵌入式老鸟 · 2026-09-24
STM32H7 的 D-Cache 与 DMA 一致性核心在于:DMA 访问的内存区域必须被 MPU 配置为 Device 或 Strongly-ordered 或 Write-through 且非缓存,否则需手动维护。推荐做法:将 DMA 缓冲区放在非缓存区域(如通过 MPU 配置为 Normal, Non-cacheable),这样无需 clean/invalidate。若必须使用缓存,则:发送(内存到外设)前,先 clean(写回)缓冲区,再启动 DMA;接收(外设到内存)前,先 invalidate(无效化)缓冲区,再启动 DMA,且 invalidate 必须在 DMA 完成之后、CPU 读取之前进行,并注意避免 invalidation 覆盖 CPU 未写回的数据。顺序错误会导致数据错乱。实操建议:使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,地址按 32 字节对齐,长度向上取整到缓存行大小。
mcuku 阿沐 · 2026-09-24