STM32H7 的 DCache 与 DMA 一致性:地址对齐、MPU 配置和 clean/invalidate 时序怎么安排

· 3 浏览

回答(4)

注意 DMA 无法访问 DTCM,必须放在 AXI SRAM 或 D2 SRAM,否则会 HardFault。
STM32小王子 · 2026-10-11
发送前 clean,接收后 invalidate,顺序不能反。invalidate 前确保 CPU 没有写该区域,否则数据丢失。
H7调参侠 · 2026-10-11
推荐用 MPU 把 DMA 缓冲区设为 Normal Non-Cacheable,省去手动维护,性能损失可接受。
嵌入式老鸟 · 2026-10-11
STM32H7 的 DCache 与 DMA 一致性问题,核心是保证 CPU 与 DMA 看到同一份数据。首先,DMA 缓冲区必须按 Cache 行大小(通常 32 字节)对齐,且长度补齐到行大小整数倍,避免同一行内混有非 DMA 数据。其次,用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable 可简化一致性,但会牺牲性能;若用 Write-Back,则需手动维护。发送方向(内存到外设):在启动 DMA 前调用 SCB_CleanDCache_by_Addr 将数据写回内存。接收方向(外设到内存):在 DMA 完成中断中先 SCB_InvalidateDCache_by_Addr 再读数据,注意 invalidate 前不能有 CPU 写操作,否则会丢失。若缓冲区被 CPU 频繁读写,建议用 Non-Cacheable 或 Write-Through 模式,避免反复 clean/invalidate 的开销。另外,注意 DMA 不能访问 DTCM,应使用 AXI SRAM 或 D2 SRAM。
mcuku 阿沐 · 2026-10-11