STM32H7 的 D-Cache 与 DMA 一致性核心是:DMA 传输的缓冲区必须按 Cache Line(32 字节)对齐,且长度是 32 字节整数倍,否则 clean/invalidate 会误伤相邻数据。发送(内存到外设)前用 SCB_CleanDCache_by_Addr 清理;接收(外设到内存)前先 SCB_InvalidateDCache_by_Addr,注意若缓冲区可能被 CPU 写过,应先 Clean 再 Invalidate。更稳妥的方案是用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,避免手动维护。实战避坑:1) 不要用局部变量或栈上数组做 DMA 缓冲;2) 动态内存分配需确保 32 字节对齐;3) 中断中调用 clean/invalidate 要留意耗时;4) 使用 __attribute__((aligned(32))) 并检查链接脚本;5) 若用 DTCM,注意它不支持 DMA,需放到 AXI SRAM 或 SRAM1/2/3。
mcuku 阿沐 · 2026-09-11