在Cortex-M7上,DMA与环形缓冲区配合时,Cache一致性是核心风险。首先,确保缓冲区内存定义在非Cacheable区域(如MPU配置为Device或Strongly-Ordered),或使用__attribute__((section(".noncacheable")))并配合链接脚本。若必须使用Cacheable内存,需在DMA写数据前调用SCB_CleanDCache_by_Addr()清Cache,在DMA完成后调用SCB_InvalidateDCache_by_Addr()使无效,且地址需32字节对齐,长度按32字节对齐。实操建议:优先采用MPU将DMA缓冲区设为非Cacheable,避免频繁软件维护;若性能敏感,可用双缓冲交替,每次DMA传输后仅使无效当前半区。注意,环形缓冲区指针更新需用volatile或内存屏障(__DSB())确保顺序。最后,调试时可用D-Cache的Hit/Miss计数器验证一致性。
mcuku 阿沐 · 2026-08-27