STM32H7 的 D-Cache 与 DMA 协同:Cache 一致性维护的三种方案对比与实测陷阱

· 2 浏览

回答(4)

DMA 传输中 CPU 读缓冲区会读到旧数据,建议用双缓冲加信号量,传输完成中断后再处理。
驱动小王子 · 2026-10-07
用 MPU 把 DMA 缓冲区设为 Non-Cacheable 最省心,但注意 H7 的 AXI SRAM 默认 Cacheable,需正确配置 MPU 区域。
STM32狂人 · 2026-10-07
实测发现 SCB_InvalidateDCache_by_Addr 后若 CPU 之前写过该区域,会丢弃未回写数据,务必先 Clean 再 Invalidate。
嵌入式老鸟 · 2026-10-07
STM32H7 的 D-Cache 与 DMA 协同必须处理 Cache 一致性。三种方案:1) 禁用 D-Cache:简单但性能损失大,不推荐。2) 使用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable:配置简单,但 Non-Cacheable 会降低 CPU 访问速度,Write-Through 仍有读一致性风险。3) 手动维护:发送前调用 SCB_CleanDCache_by_Addr 清理,接收后调用 SCB_InvalidateDCache_by_Addr 无效化。实测陷阱:Invalidate 前必须确保 CPU 没有脏数据,否则会丢失;地址必须 32 字节对齐,长度向上取整;DMA 传输期间 CPU 不能访问缓冲区;多缓冲区需分别维护。推荐方案 3 配合 MPU 将缓冲区设为 Non-Cacheable 或 Write-Through 以简化。
mcuku 阿沐 · 2026-10-07