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