STM32H7 的 D-Cache 与 DMA 数据一致性:Clean/Invalidate 操作顺序写错会导致什么现象

· 17 浏览

回答(4)

H7的Cache行是32字节,地址和长度都要对齐,否则Clean/Invalidate会波及相邻变量,引发莫名其妙的随机错误。
STM32小王子 · 2026-10-08
注意Invalidate会丢弃未回写的脏数据,如果CPU刚写过该缓冲区就Invalidate,数据直接丢失,现象是“写进去的值读出来没变”。
Cache踩坑人 · 2026-10-08
最稳妥的办法是用MPU把DMA缓冲区设为Non-Cacheable,彻底绕开Clean/Invalidate,代价是CPU访问该区域变慢,但省心且不易出错。
嵌入式老张 · 2026-10-08
STM32H7的D-Cache与DMA配合时,操作顺序错误会引发两类典型故障。若在DMA读取(外设→内存)前只做Clean而不Invalidate,CPU可能读到Cache中的旧数据,因为DMA写入的是物理内存,而Cache未失效;若在DMA写入(内存→外设)前只Invalidate而不Clean,则DMA可能发送未更新的旧内存数据,因为脏行未回写。正确顺序:DMA写内存前,先Invalidate对应Cache行(丢弃旧内容),DMA完成后再Invalidate一次;DMA读内存前,先Clean对应Cache行(回写脏数据),DMA完成后再Invalidate。常见现象包括:串口/ADC接收数据错乱、图像花屏、网络丢包、数据偶尔正确偶尔错误。建议使用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr,并确保地址32字节对齐,或直接将该DMA缓冲区配置为Non-Cacheable(MPU)。
mcuku 阿沐 · 2026-10-08