STM32H7 的 D-Cache 与 DMA 协同核心是“对齐 + 维护 + 一致性”。首先,DMA 缓冲区必须按 Cache 行(Cortex-M7 为 32 字节)对齐,且长度建议为 32 字节整数倍,否则维护操作会波及相邻数据。其次,区分方向:外设到内存(DMA 写)时,在启动 DMA 前对缓冲区执行 SCB_InvalidateDCache_by_Addr,防止 Cache 中的旧数据覆盖新数据;内存到外设(DMA 读)时,在启动 DMA 前执行 SCB_CleanDCache_by_Addr,确保数据写入物理内存。若缓冲区同时被 CPU 和 DMA 访问,应使用 MPU 将该区域配置为 Write-Through 或 Non-Cacheable,避免反复维护。排查时先确认地址对齐,再检查维护函数是否在正确时机调用,最后用内存屏障 __DSB() 保证顺序。常见坑:DMA 传输中 CPU 访问了缓冲区导致 Cache 行被重新加载,或维护地址未按 32 字节对齐。
mcuku 阿沐 · 2026-09-26