STM32H7开启D-Cache后DMA数据错乱,核心是维护Cache与内存的一致性。首先确保DMA缓冲区地址和长度按Cache行大小(通常32字节)对齐,推荐使用__attribute__((aligned(32)))定义数组,并避免跨行访问。其次区分方向:外设到内存(如ADC、UART接收)应在DMA启动前对缓冲区执行SCB_InvalidateDCache_by_Addr,防止Cache中旧数据覆盖新数据;内存到外设(如发送)应在DMA启动前执行SCB_CleanDCache_by_Addr,确保数据写入物理内存。若DMA传输期间CPU可能访问该缓冲区,需在传输完成中断中再次Invalidate(接收)或Clean(发送)。注意:Invalidate前必须确保没有未完成的写操作,否则会丢失数据。更稳妥的方案是将DMA缓冲区放在MPU配置为Write-Through或Non-Cacheable的内存区域,彻底避免一致性问题。
mcuku 阿沐 · 2026-09-26