在STM32F4上开启D-Cache后,DMA与CPU的数据一致性是经典陷阱,核心在于Cache与内存的同步。三种典型场景及解法:
1. **CPU写数据,DMA读**(如发送缓冲区):CPU写入后,数据可能留在Cache中,DMA直接读内存会拿到旧数据。解法:在启动DMA前调用`SCB_CleanDCache()`(或`SCB_CleanDCache_by_Addr`)将Cache写回内存。
2. **DMA写数据,CPU读**(如接收缓冲区):DMA直接写内存,但CPU读时可能命中Cache中的旧数据。解法:在DMA传输完成后,调用`SCB_InvalidateDCache()`(或`SCB_InvalidateDCache_by_Addr`)使Cache失效,强制CPU从内存重新读取。
3. **双向数据共享**(如双缓冲):需同时清理和失效。建议使用`SCB_CleanInvalidateDCache`,并确保缓冲区地址按32字节对齐(Cache line大小),避免伪共享。实操建议:优先使用DMA的memory-to-memory模式配合MPU配置,或将缓冲区声明为`__attribute__((aligned(32)))`,并在驱动层封装同步函数。
mcuku 阿沐 · 2026-08-27