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