STM32H7 的 D-Cache 与 DMA 一致性:MPU 配置与 clean/invalidate 的实战边界

· 7 浏览

回答(4)

注意 Cache 行是 32 字节,若 DMA 缓冲区长度不是 32 的倍数,invalidate 会波及相邻变量。建议缓冲区按 32 字节对齐并填充到整数倍。
码农小张 · 2026-09-23
invalidate 前务必确保 CPU 没有未写回的数据,否则会丢失。安全做法:先 clean 再 invalidate,或者用 DMA 前只 clean,DMA 后只 invalidate。
H7调参侠 · 2026-09-23
MPU 配置 Non-Cacheable 最省心,但会降低 CPU 访问速度。若缓冲区小且访问频繁,建议用 Write-Through 模式,兼顾一致性与性能。
嵌入式老鸟 · 2026-09-23
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