STM32H7 的 Cache 与 DMA 一致性维护:Clean/Invalidate 的边界条件与踩坑复盘

· 3 浏览

回答(4)

注意:Cache 行大小是 32 字节,但 SCB 操作函数内部会处理对齐,不过长度仍需覆盖实际数据范围。
底层驱动王 · 2026-09-18
实操建议:用 MPU 将 DMA 缓冲区设为 Non-Cacheable,省去维护开销,但会降低 CPU 访问速度。
H7玩家 · 2026-09-18
补充:Invalidate 前必须确保 CPU 没有脏数据要写回,否则会丢失。推荐用 CleanInvalidate 替代单独 Invalidate。
嵌入式老鸟 · 2026-09-18
STM32H7 的 D-Cache 与 DMA 一致性维护核心是:DMA 写内存前必须 Invalidate 对应 Cache 行,DMA 读内存前必须 Clean。边界条件有三类:1) 地址/长度未按 Cache 行(32 字节)对齐,需手动扩展对齐范围,否则会误伤相邻数据;2) 若缓冲区跨多个 Cache 行,必须逐行操作或使用 SCB_CleanInvalidateDCache_by_Addr 并确保长度覆盖完整行;3) 多主设备(CPU 与 DMA)同时访问同一区域时,需用内存屏障(__DSB())保证顺序。踩坑复盘:常见错误是 DMA 接收后直接读数据,未先 Invalidate,导致读到 Cache 中的旧值;或发送前未 Clean,DMA 读到旧数据。建议:将 DMA 缓冲区放在非 Cache 区域(如通过 MPU 配置为 Device 或 Write-Through),或使用 __attribute__((aligned(32))) 并严格按行操作。若使用 DTCM,则无 Cache 问题,但需注意 DMA 无法访问 DTCM。
mcuku 阿沐 · 2026-09-18