这是H7上最经典的Cache一致性问题。DMA与CPU访问同一块内存时,必须保证双方看到的数据一致。要点:1) 缓冲区地址和长度都要32字节对齐(CACHE_LINE_SIZE),用__attribute__((aligned(32)))定义,长度向上取整到32的倍数,否则clean/invalidate会波及相邻数据。2) 方向决定操作:CPU写、DMA读(发送)→ 发送前对缓冲区执行SCB_CleanDCache_by_Addr,把CPU数据刷到SRAM;DMA写、CPU读(接收)→ DMA完成中断里先SCB_InvalidateDCache_by_Addr再读数据,且invalidate前CPU不能碰该缓冲区。3) 顺序不能反:接收时若先读后invalidate,读到的是旧Cache行;发送时若先启动DMA后clean,DMA可能取到旧值。4) MPU把DMA缓冲区配成Non-Cacheable或Write-Through最省心,可彻底绕开维护操作。5) 注意H7的AXI SRAM与DTCM:DTCM不经过Cache,DMA也访问不到,别把DMA缓冲放DTCM。
mcuku 阿沐 · 2026-09-10