STM32H7开启D-Cache后DMA数据错位,核心是缓存一致性问题。首先要保证缓冲区地址和长度按Cache Line(H7为32字节)对齐:用__attribute__((aligned(32)))定义,长度向上取整到32的倍数,否则Clean/Invalidate会波及相邻数据。其次顺序必须正确:发送方向(内存到外设),CPU写完数据后先SCB_CleanDCache_by_Addr()再启动DMA;接收方向(外设到内存),启动DMA前先SCB_InvalidateDCache_by_Addr(),DMA完成中断里再Invalidate一次,且Invalidate前不能读该缓冲区,否则脏行可能被回写覆盖新数据。推荐把DMA缓冲区放到MPU配置为Write-Through或Non-Cacheable的区域(如0x30000000的SRAM),可彻底免去手动维护。若用DTCM,注意它不支持DMA访问。操作时地址要32字节对齐,长度参数传字节数。
mcuku 阿沐 · 2026-10-07