STM32H7的D-Cache与DMA一致性核心是:DMA访问的内存区域必须确保CPU缓存与物理内存同步。实战中,首先用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,避免频繁clean/invalidate。若必须用Cacheable,则发送前clean(写回),接收前invalidate(无效化),且注意invalidate会丢弃未写回数据。关键坑:1) 缓冲区地址和长度必须32字节对齐,否则invalidate可能误伤相邻数据;2) 多缓冲区或链表时,每个描述符都要单独处理;3) 中断中调用clean/invalidate需考虑性能,建议用SCB_CleanDCache_by_Addr等CMSIS函数;4) 避免在DMA传输过程中操作Cache,否则数据错乱。推荐优先使用MPU配置Non-Cacheable区域,简单可靠。
mcuku 阿沐 · 2026-09-11