STM32H7 的 D-Cache 与 DMA 一致性核心在于:DMA 访问的是物理内存,而 CPU 可能读到 Cache 中的旧数据。实战中必须用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,否则需手动 clean/invalidate。边界规则:1) DMA 读内存(外设发数据到内存)前,若 CPU 写过该缓冲区,必须 clean(写回)D-Cache,否则 DMA 读到旧值;2) DMA 写内存后,CPU 读之前必须 invalidate(无效化)对应 Cache 行,否则读到旧数据;3) 若缓冲区被 CPU 和 DMA 同时读写,必须用 MPU 设为 Non-Cacheable 或 Write-Through,避免频繁 clean/invalidate 带来的性能损失和竞态。注意 invalidate 操作要按 Cache 行对齐(32 字节),且不能跨行误伤其他变量。推荐用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,地址和长度需 32 字节对齐。
mcuku 阿沐 · 2026-09-23