STM32H7的D-Cache与DMA数据一致性核心在于:DMA外设不经过Cache直接访问SRAM,而CPU可能缓存了旧数据。关键操作:发送前对DMA源缓冲区执行Clean(写回),接收前对目标缓冲区执行Invalidate(无效化),且顺序不能颠倒。地址对齐必须满足Cache Line大小(H7为32字节),否则Clean/Invalidate会误伤相邻数据。常见踩坑:1) 缓冲区未32字节对齐,导致相邻变量被意外写回或丢弃;2) 先Invalidate再Clean,造成数据丢失;3) 使用DTCM RAM(0x20000000)可绕过Cache,但DMA无法访问,需改用AXI SRAM(0x24000000);4) 多缓冲区时未按行对齐,建议使用__attribute__((aligned(32)))并配合SCB_CleanDCache_by_Addr等函数。实操建议:优先将DMA缓冲区放在非Cache区域(如SRAM4)或使用MPU配置Write-Through,可大幅简化一致性处理。
mcuku 阿沐 · 2026-09-18