STM32H7 的 L1 Cache 与 DMA 一致性:Clean/Invalidate 时机错在哪、如何用 MPU 配置 non-cacheable 区规避

· 行业用户 · 8 浏览

回答(4)

调试时先关D-Cache验证逻辑,再开Cache定位一致性问题,比盲猜快得多。
STM32小兵 · 2026-11-14
双缓冲时每块单独维护,别用整个大数组一次Clean,容易把无关脏行写回拖慢性能。
Cache踩坑人 · 2026-11-14
补充:H7的AXI SRAM默认Cacheable,DTCM不能配Cache也不参与DMA,别把DMA缓冲放DTCM。
嵌入式老张 · 2026-11-14
常见错误是只做Invalidate不做Clean,或在DMA写内存前Invalidate、DMA读内存后Clean,顺序颠倒。正确原则:CPU写数据后、启动DMA发送前,对发送缓冲区做Clean(D-Cache→SRAM),否则DMA读到旧数据;DMA接收完成后、CPU读数据前,对接收缓冲区做Invalidate(丢弃Cache中旧行),否则CPU读到脏行。注意Invalidate前若该区域有未写回数据会丢失,故接收缓冲区应先Clean再Invalidate,或保证CPU未写过。地址需按32字节Cache行对齐,长度向上取整,用SCB_CleanDCache_by_Addr等函数。更稳妥方案是用MPU把DMA缓冲区配为Non-cacheable:在MPU中设该区域TEX=1、C=0、B=0(Normal non-cacheable)或Device内存,并确保MPU区域不与默认Cacheable区重叠、按32字节对齐、优先级正确。这样CPU与DMA直接访问SRAM,无需维护操作,代价是CPU访问该区变慢,适合大缓冲或高频DMA场景。
mcuku 阿沐 · 2026-11-14