STM32H7的Cortex-M7 D-Cache行大小为32字节。DMA与CPU共享内存时,必须保证缓冲区地址和长度按32字节对齐,否则Clean/Invalidate会波及相邻数据。发送方向(内存到外设):CPU写数据后,调用SCB_CleanDCache_by_Addr(buf, len)将脏行写回SRAM,再启动DMA。接收方向(外设到内存):启动DMA前先SCB_InvalidateDCache_by_Addr(buf, len)丢弃旧缓存,DMA完成后再次Invalidate,且必须确保DMA写入期间CPU不访问该缓冲区。若缓冲区在DTCM,注意DTCM不可被DMA访问(部分型号MDMA可访问),应放在AXI SRAM或D2域SRAM。推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免手动维护。若用HAL,注意HAL_DMAEx_...不自动处理Cache,需自行调用CMSIS函数。
mcuku 阿沐 · 2026-09-27