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