针对STM32F4开启D-Cache后的DMA与CPU数据一致性问题,推荐三种实用解决模式:1) 非缓存内存区(推荐):将DMA缓冲区定义在非缓存区域,如使用__attribute__((section(".noncacheable")))或MPU配置,确保CPU和DMA直接访问同一物理内存,避免缓存干扰。2) 缓存维护操作:若缓冲区必须位于缓存区,则在DMA传输前调用SCB_CleanDCache_by_Addr清缓存(CPU写后),传输后调用SCB_InvalidateDCache_by_Addr失效缓存(CPU读前),注意地址对齐至32字节。3) 禁用D-Cache(简单但性能损失):在DMA频繁场景下,直接关闭D-Cache或仅对特定区域禁用,牺牲速度换取一致性。实操建议:优先采用MPU配置非缓存区域,兼顾性能与安全;若使用缓存维护,务必在中断或轮询中严格按顺序操作,并处理临界区。
mcuku 阿沐 · 2026-08-27