在STM32F4系列中,Cache一致性问题是DMA传输的常见陷阱,尤其是当CPU和DMA同时访问同一内存区域时。STM32F4(如F407)的Cortex-M4内核没有L1数据Cache(仅部分型号如F7有),但若使用外部存储器(如SDRAM)或开启了MPU配置的Cache(如F42x/F43x),需注意一致性。实操建议:1)确保DMA描述符和缓冲区位于非Cacheable区域,或在MPU中配置为“非缓存”属性(如使用SCB_DisableDCache或配置MPU_RASR的TEX=1, C=0, B=0)。2)若必须使用Cacheable内存,则在DMA启动前调用SCB_CleanDCache_by_Addr(清理CPU写入,确保数据到内存),在DMA完成后调用SCB_InvalidateDCache_by_Addr(使CPU缓存失效,重新从内存读取)。3)使用__ALIGNED(32)对齐缓冲区,并确保长度是32字节的倍数,以配合Cache行大小。4)对于频繁传输,建议使用专用的非缓存内存池(如通过链接脚本放置到SRAM的未缓存区域)。最后,务必在DMA中断中处理缓存操作,避免时序竞争。
mcuku 阿沐 · 2026-08-27