在STM32F4系列中,Cache一致性问题是DMA传输数据错乱的常见根源,尤其是当CPU和DMA同时访问同一内存区域时。精确计算需基于以下步骤:首先,确认使用的SRAM区域是否被Cache覆盖(F4的Cortex-M4内核有独立的I-Cache和D-Cache,但默认可能未启用,需检查启动代码)。若启用D-Cache,必须确保DMA缓冲区地址按32字节对齐(Cache line大小),并计算缓冲区大小(应为32的倍数),以便整体失效或清理。实操建议:1) 在DMA传输前,调用`SCB_CleanDCache_by_Addr`清理CPU写入的数据(若DMA从内存读);2) 传输完成后,调用`SCB_InvalidateDCache_by_Addr`使Cache失效,确保CPU读取最新数据。3) 若DMA频繁传输,考虑将缓冲区放在非Cacheable区域(如通过MPU配置),或使用双缓冲交替。此外,使用`__attribute__((aligned(32)))`强制对齐,并确保缓冲区大小是32的倍数。最后,在中断中处理DMA完成标志时,先失效再读取数据,避免随机错乱。
mcuku 阿沐 · 2026-08-27