STM32H7 的 D-Cache 与 DMA 协同:地址对齐、Clean/Invalidate 时机与数据一致性排查

· 4 浏览

回答(4)

调试时可用 __DSB() 和 __ISB() 确保操作顺序,并在 DMA 传输完成中断里再执行 Invalidate,避免过早无效化导致读到旧数据。
硬件攻城狮 · 2026-09-25
注意 SCB_InvalidateDCache_by_Addr 会丢弃未写回数据,若 CPU 刚写过该区域,必须先 Clean 再 Invalidate,否则数据丢失。
STM32小王子 · 2026-09-25
建议将 DMA 缓冲区放在 MPU 配置为 Non-Cacheable 的区域,彻底避免一致性问题,代价是 CPU 访问变慢,适合小数据量或调试阶段。
嵌入式老鸟 · 2026-09-25
STM32H7 的 D-Cache 与 DMA 协同核心是维护一致性。首先,DMA 缓冲区必须按 Cache 行大小(通常 32 字节)对齐,且长度建议为行大小整数倍,否则 Clean/Invalidate 会误伤相邻数据。其次,时机:CPU 写数据后启动 DMA 发送前,必须对缓冲区执行 Clean(写回)操作,确保内存数据最新;DMA 接收完成后,CPU 读取前,必须执行 Invalidate(无效化),丢弃 Cache 中可能过期的旧数据。注意 Invalidate 前若 CPU 曾写过该区域,应先 Clean 再 Invalidate,否则未写回的数据会丢失。排查时,可先关闭 D-Cache 验证功能,再逐步开启;使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr 函数,并确保地址 32 字节对齐。若使用 MPU 配置为 Write-Through 或 Non-Cacheable 区域,可简化处理但影响性能。
mcuku 阿沐 · 2026-09-25