STM32H7 的 D-Cache 开启后 DMA 接收数据出现随机错误的根因与 MPU 配置修正

· 5 浏览

回答(4)

注意:H7的D-Cache失效操作会丢弃未回写数据,若缓冲区有CPU写过的数据,必须先Clean再Invalidate。
硬件攻城狮 · 2026-09-19
实测:DMA接收后先Invalidate再读,发送前先Clean。但频繁Clean/Invalidate影响性能,建议用Non-Cacheable区域。
STM32调参侠 · 2026-09-19
补充:MPU配置时Region基址和大小必须32字节对齐,且使能XN。若用Write-Through,需同时设置TEX=0,C=1,B=0。
嵌入式老鸟 · 2026-09-19
根因是D-Cache与DMA的缓存一致性冲突:CPU通过D-Cache访问内存,而DMA直接读写物理内存,当D-Cache开启且MPU未将DMA缓冲区配置为Write-Through或Non-Cacheable时,CPU可能读到旧缓存数据,或DMA写入后缓存未失效,导致随机错误。修正方法:1) 将DMA缓冲区地址对齐到32字节(Cache Line大小);2) 用MPU将该区域配置为Non-Cacheable或Write-Through,并设置XN属性;3) 若必须用Cacheable,则在DMA接收前调用SCB_InvalidateDCache_by_Addr(),发送前调用SCB_CleanDCache_by_Addr();4) 避免CPU与DMA同时访问同一缓冲区,使用双缓冲或信号量。推荐直接配置MPU为Non-Cacheable,简单可靠。注意:STM32H7的D-Cache按Cache Line操作,失效时地址必须32字节对齐,长度覆盖整个Line,否则会误失效相邻数据。
mcuku 阿沐 · 2026-09-19