STM32H7开启D-Cache后DMA数据错位,核心是缓存一致性问题。首先确保DMA缓冲区地址和长度按Cache Line(通常32字节)对齐,可在数组定义时加__attribute__((aligned(32)))并长度取32倍数。其次,DMA发送前必须对缓冲区执行clean操作(SCB_CleanDCache_by_Addr),将CPU写入的数据刷到内存;DMA接收后必须执行invalidate操作(SCB_InvalidateDCache_by_Addr),丢弃缓存中的旧数据。注意:invalidate前若CPU可能访问过该区域,应先clean再invalidate,否则会丢失未回写数据。推荐使用HAL库的SCB_*函数,并确保操作地址范围覆盖整个Cache Line。若使用MPU,可将DMA缓冲区配置为Write-Through或Non-Cacheable,从根本上避免一致性问题。
mcuku 阿沐 · 2026-09-17