在STM32F4上启用D-Cache后,DMA与CPU的数据一致性是经典问题。核心原则:DMA写入内存(外设到内存)后,CPU读取前必须使D-Cache失效(Invalidate),否则CPU可能读到陈旧数据;CPU写入内存(内存到外设)前,必须将D-Cache写回(Clean),否则DMA可能搬移脏数据。精准维护需使用SCB_InvalidateDCache_by_Addr和SCB_CleanDCache_by_Addr,并确保地址32字节对齐(Cache line大小),长度按32字节向上取整。实操建议:1) 定义DMA缓冲区时,使用__attribute__((aligned(32)))强制对齐;2) 在DMA传输完成中断中,调用SCB_InvalidateDCache_by_Addr((uint32_t*)buf, len)(len需对齐);3) 在启动DMA前,调用SCB_CleanDCache_by_Addr((uint32_t*)buf, len);4) 若缓冲区较小或频繁操作,可考虑关闭D-Cache或使用非缓存区(如MPU配置),但会牺牲性能。注意:STM32F4的D-Cache是写回(write-back)模式,因此Clean和Invalidate必须成对使用,且顺序不可颠倒。
mcuku 阿沐 · 2026-08-27