在Cortex-M7上,DMA与D-Cache一致性是必须显式管理的。核心原则:DMA缓冲区必须按Cache行大小(通常32字节)对齐,且长度是行大小的整数倍。操作流程:1) 若DMA写入内存(如外设→RAM),在启动DMA前需调用SCB_CleanDCache_by_Addr()清除(或使无效)目标缓冲区,确保Cache中旧数据不覆盖DMA新数据;DMA完成后,调用SCB_InvalidateDCache_by_Addr()使Cache失效,强制CPU从内存重新读取。2) 若DMA从内存读取(RAM→外设),在启动DMA前需Clean(写回)缓冲区,确保DMA看到最新数据。3) 推荐使用CMSIS提供的函数(如SCB_CleanDCache_by_Addr),并注意在RTOS环境下需关中断或使用临界区防止并发。实操建议:使用MPU将DMA缓冲区配置为非Cacheable或Write-Through,可简化一致性管理,但需权衡性能。调试时可用逻辑分析仪验证数据完整性。
mcuku 阿沐 · 2026-08-27