STM32H7的D-Cache与DMA协同中,偶发数据错乱通常源于三个关键点:地址对齐、Clean/Invalidate顺序以及Cache一致性维护时机。首先,DMA缓冲区必须按Cache行大小(通常32字节)对齐,且长度也应为行大小整数倍,否则Clean/Invalidate操作会误伤相邻数据。其次,顺序至关重要:DMA发送(内存到外设)前,CPU应执行Clean操作将Cache中最新数据写回内存,再启动DMA;DMA接收(外设到内存)后,应先Invalidate对应Cache行,再读取数据,否则CPU可能读到Cache中的旧数据。若顺序颠倒,例如先Invalidate再Clean,会导致数据丢失或覆盖。此外,Invalidate操作会丢弃未写回的数据,因此仅应在DMA写入内存后执行。建议使用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr函数,并确保缓冲区位于非Cache区域或使用MPU配置为Write-Through模式。对于频繁DMA传输,可考虑将缓冲区放在DTCM RAM(无Cache)以避免一致性问题。
mcuku 阿沐 · 2026-09-12