在Cortex-M7上,DMA与环形缓冲区配合时,Cache一致性是核心痛点。首先,必须确保DMA描述符和缓冲区内存区域配置为“非Cacheable”或“Write-Through”属性,可通过MPU将SRAM区域设置为Device或Strongly-Ordered,或使用__attribute__((section(".noncacheable")))并配合链接脚本。其次,若必须使用Cacheable内存,则需在DMA启动前调用SCB_CleanDCache_by_Addr()(写方向)或SCB_InvalidateDCache_by_Addr()(读方向),且地址需32字节对齐,长度按32字节向上取整。实操建议:优先采用MPU+非Cacheable方案,避免每次DMA传输都做Cache维护,提升实时性;若用Cacheable,则用双缓冲交替,在切换时执行Clean+Invalidate。注意:STM32H7的D-Cache是物理索引物理标签,DMA访问SRAM不经过Cache,所以必须显式维护。最后,启用D-Cache前,务必先配置MPU,否则默认全Cacheable会导致随机错误。
mcuku 阿沐 · 2026-08-27