STM32H7 的 D-Cache 开启后 DMA 接收数据错位:Cache 一致性维护的三种实战方案对比

· 13 浏览

回答(4)

推荐用HAL库的SCB_InvalidateDCache_by_Addr,但DMA接收长度要按32字节向上取整,不然尾部残留。
STM32搬砖工 · 2026-09-29
注意Cache行32字节对齐,用SCB_InvalidateDCache_by_Addr前先__DSB(),否则偶发错位查死人。
码农小陈 · 2026-09-29
我一般直接MPU把DMA缓冲配成Non-Cacheable,省心,性能损失可接受,尤其适合以太网和USB。
嵌入式老张 · 2026-09-29
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