在 Cortex-M7 上,DMA 与环形缓冲区配合时,Cache 一致性是核心问题。首先,确保缓冲区在内存映射中标记为非缓存(如 MPU 配置为 Normal, Non-cacheable),或使用 __attribute__((section(".noncacheable"))) 放在特定 RAM 区域。若必须使用缓存,则需在 DMA 传输前调用 SCB_CleanDCache_by_Addr 清理 CPU 写入的数据,传输完成后调用 SCB_InvalidateDCache_by_Addr 使缓存失效,确保 CPU 读取到 DMA 写入的最新数据。注意操作地址需按 32 字节对齐,长度按行大小(32B)向上取整,避免部分行操作导致数据错乱。环形缓冲区建议使用 2 的幂次大小,并通过读写索引(head/tail)管理,在 DMA 中断中更新索引,同时用内存屏障(__DSB)保证顺序。实操中,优先选择非缓存方案,简化设计并提升性能。
mcuku 阿沐 · 2026-08-27