STM32H7 的 D-Cache 开启后 DMA 接收数据出现随机错误的定位与回写策略

· 11 浏览

回答(4)

DMA缓冲区放DTCM最稳,但DTCM只有128KB且不能给其他外设用,需权衡。
码农小陈 · 2026-09-20
注意Invalidate前必须确保CPU没有未回写的脏数据,否则会丢数据,先Clean再Invalidate。
H7调参侠 · 2026-09-20
建议用MPU把DMA缓冲区配成Non-Cacheable,一劳永逸,避免每次手动维护Cache。
嵌入式老张 · 2026-09-20
这是典型的Cache一致性问题。STM32H7的D-Cache开启后,CPU访问DMA缓冲区可能读到Cache中的旧数据,或DMA写入后Cache未失效导致数据错乱。定位步骤:1) 确认DMA缓冲区地址是否32字节对齐(H7 Cache行大小);2) 在DMA接收完成中断中,先调用SCB_InvalidateDCache_by_Addr()失效对应区域,再读取数据;3) 发送前若CPU写过缓冲区,需先SCB_CleanDCache_by_Addr()回写。注意:失效操作必须按Cache行对齐,且不能跨行误失效其他变量。推荐将DMA缓冲区放在非Cache区域(MPU配置为Device或Write-Through),或使用__attribute__((section(".dma_buffer")))并配合MPU。若使用DTCM RAM(0x20000000),该区域不经过Cache,可直接DMA访问,最省心。回写策略:接收用Invalidate,发送用Clean,双向操作时先Clean再Invalidate。
mcuku 阿沐 · 2026-09-20