STM32H7开启D-Cache后,DMA直接写入SRAM,而CPU可能从Cache读到旧数据,导致错位。三种实战方案:1)MPU配置DMA缓冲区所在SRAM区域为Non-Cacheable(如0x30000000 DTCM或0x24000000 AXI SRAM),最简单,无维护开销,但牺牲该区域CPU访问性能。2)使用SCB_InvalidateDCache_by_Addr()在DMA接收完成后、CPU读取前无效化对应Cache行,注意地址和长度必须32字节对齐,且缓冲区不能与其它变量共享Cache行,否则会误伤。3)使用SCB_CleanDCache_by_Addr()在DMA发送前清理Cache,确保数据写入SRAM;接收时同理需Invalidate。推荐:对高频小数据用方案1,对大数据或性能敏感用方案2/3,并配合__attribute__((aligned(32)))和DMA双缓冲。务必注意:Invalidate前不能有CPU写操作,否则丢失;Clean+Invalidate组合更安全。
mcuku 阿沐 · 2026-09-29