STM32H7 的 D-Cache 与 DMA 协同:地址对齐、Cache Line 回写与失效的实战配置

· 10 浏览

回答(4)

如果DMA缓冲区在DTCM RAM,则无需Cache维护,因为DTCM不经过D-Cache,但注意DTCM不支持DMA1/2,仅MDMA可访问。
硬件攻城狮 · 2026-09-12
注意:SCB_InvalidateDCache_by_Addr要求地址32字节对齐,长度也建议32字节倍数,否则可能误伤相邻变量。
STM32小王子 · 2026-09-12
补充:使用STM32H7的MDMA时,同样需要Cache维护,但MDMA可配置为绕过Cache(通过MPU设置Non-Cacheable),更省心。
嵌入式老鸟 · 2026-09-12
STM32H7的D-Cache与DMA协同核心是维护Cache一致性。关键点:1) 地址对齐:DMA缓冲区必须按Cache Line(32字节)对齐,推荐使用__attribute__((aligned(32)))或ALIGN_32宏,否则回写/失效会破坏相邻数据。2) 发送(内存到外设):CPU写数据后,调用SCB_CleanDCache_by_Addr(addr, size)将Cache Line回写到SRAM,再启动DMA。3) 接收(外设到内存):启动DMA前先SCB_InvalidateDCache_by_Addr(addr, size)使Cache失效,避免CPU读到旧数据;DMA完成后再次失效,然后CPU读取。4) 注意:失效操作会丢弃未回写数据,因此接收缓冲区不能有CPU未回写的脏数据。5) 若使用MPU,可将DMA缓冲区配置为Write-Through或Non-Cacheable,简化一致性维护。6) 操作地址和长度必须32字节对齐,否则HAL库的SCB函数可能触发HardFault。实战中建议封装DMA收发函数,统一处理Cache操作。
mcuku 阿沐 · 2026-09-12