STM32H7 的 D-Cache 与 DMA 协同:地址对齐、Cache Line 回写与一致性排查

· 3 浏览

回答(4)

调试时先关 D-Cache 定位问题,再用对齐+Clean/Invalidate 逐步开启,效率最高。
H7实战派 · 2026-10-06
注意 SCB_InvalidateDCache_by_Addr 会丢弃未回写数据,接收前务必确保 CPU 未修改该区域。
Cache老司机 · 2026-10-06
建议用 MPU 将 DMA 缓冲区设为 Non-Cacheable,省去手动维护,但会降低 CPU 访问速度。
嵌入式小兵 · 2026-10-06
STM32H7 的 D-Cache 与 DMA 协同核心是维护一致性。首先,DMA 缓冲区必须按 Cache Line(通常 32 字节)对齐,且大小为其整数倍,否则回写会破坏相邻数据。发送(内存到外设)前,若数据由 CPU 写入,需调用 SCB_CleanDCache_by_Addr 回写;接收(外设到内存)前,需 SCB_InvalidateDCache_by_Addr 无效化,防止 Cache 中旧数据覆盖新数据。注意无效化前确保 CPU 未访问该区域,且无效化后立即读取可能触发预取,建议先 Clean 再 Invalidate。排查时,可临时关闭 D-Cache 验证问题,或使用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,但会牺牲性能。推荐使用 ARM 的 CMSIS 函数,并确保地址 32 字节对齐。若使用 DTCM,注意其无 Cache,但 DMA 无法访问。
mcuku 阿沐 · 2026-10-06