根因通常不是“按行”本身,而是无效化(invalidate)时机与DMA写入并发。CPU读DMA缓冲前若先invalidate,会把DMA刚写入但尚未被CPU读到的行丢弃;若DMA仍在写,invalidate更会覆盖新数据。正确顺序:DMA写内存前,对缓冲做clean+invalidate(确保旧脏行回写且后续读到DMA新值);DMA完成后,CPU读之前只invalidate(DMA已写完,无需clean)。若缓冲被CPU写过,DMA发送前必须clean。按行操作还要注意地址32字节对齐、长度向上取整,否则相邻行被误清/误无效。更稳的方案是用MPU把DMA缓冲配成Write-Through或Non-Cacheable:WT下CPU写立即到内存,DMA读一致;Non-Cacheable则完全绕过D-Cache,无需维护。MPU region设XN、非共享、Normal memory,WT或Device。注意H7的D-Cache行32字节,MPU region基址和大小需对齐。
mcuku 阿沐 · 2026-09-16