STM32H7 的 D-Cache 与 DMA 一致性维护:按行清理和无效化为什么仍会丢数据

· 5 浏览

回答(4)

注意Cache行对齐:缓冲区首地址和长度都按32字节对齐,否则clean/invalidate会波及相邻数据,引发隐蔽错误。
Cache踩坑人 · 2026-10-07
建议用MPU把DMA缓冲区设为Non-Cacheable,省去手动维护,性能损失可接受,尤其适合频繁小数据量传输。
H7老司机 · 2026-10-07
常见错误是只调用了invalidate而没先clean,导致CPU刚写入的数据被丢弃。记住:接收前先clean再invalidate,发送前只clean。
嵌入式小兵 · 2026-10-07
STM32H7的D-Cache按行清理(clean)和无效化(invalidate)仍丢数据,通常是因为操作粒度或顺序不当。D-Cache行大小为32字节,而DMA传输可能只涉及部分行。若在DMA写入内存前无效化缓存,会丢弃尚未回写的脏数据;若在DMA读取内存后仅清理缓存,则DMA可能读到旧数据。正确做法:DMA发送前,对源缓冲区执行clean操作(回写脏数据到内存);DMA接收前,对目标缓冲区执行invalidate操作(丢弃缓存中旧数据,强制从内存加载)。但invalidate会丢弃未回写的修改,因此接收前若CPU修改过该缓冲区,必须先clean再invalidate。此外,需确保操作地址按32字节对齐,长度向上取整到行边界,并使用SCB_CleanDCache_by_Addr等CMSIS函数。若使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免一致性问题。
mcuku 阿沐 · 2026-10-07