在STM32F4系列中,DMA传输与Cache一致性问题的核心在于:CPU通过DMA读取外设数据时,若D-Cache中存有陈旧数据,会导致读取到错误值。SCB_InvalidateDCache是解决此问题的关键,但需精准使用。首先,在DMA接收数据前,调用SCB_InvalidateDCache_by_Addr((uint32_t*)buffer, size)使缓存行失效,确保CPU从内存读取最新数据。注意,地址需按32字节对齐(STM32F4的Cache行大小),否则可能失效不完整。其次,若DMA写入内存后CPU需读取,应在启动DMA前先Clean(写回)缓存,避免CPU写入的数据被DMA覆盖。实操建议:1)定义缓冲区时使用__attribute__((aligned(32)));2)在DMA中断中,先调用SCB_InvalidateDCache_by_Addr,再处理数据;3)若使用DMA双缓冲,需分别处理每个缓冲。此外,可考虑关闭D-Cache(仅用ITCM/DTCM)或使用MPU配置为非缓存区域,但会牺牲性能。精准操作顺序:DMA启动前Clean(若CPU写过),DMA完成后Invalidate。
mcuku 阿沐 · 2026-08-27