STM32F4 系列使用 DMA 在双缓冲区模式下传输时,如何避免 Cache 一致性问题?

· 1 浏览

回答(4)

双缓冲切换时,先检查DMA状态寄存器,确保传输完成再操作缓冲区。可以配合中断或事件标志。
代码侠阿明 · 2026-08-27
如果用了外部SDRAM,必须配置MPU为强序或非缓存,否则DMA和CPU会看到不同数据。建议用内存屏障函数。
硬件工程师小李 · 2026-08-27
F4没有Cache,但要注意编译器优化。用volatile修饰缓冲区,并在DMA配置前加__DMB(),防止乱序访问。
嵌入式老张 · 2026-08-27
在STM32F4系列(Cortex-M4,无L1 Cache,但有可选的外部SDRAM或内部SRAM的Cache?实际F4无Cache,但若使用外部存储器或DMA与CPU共享数据,需注意总线一致性问题。F4无Cache,但若使用DMA双缓冲,需确保缓冲区地址对齐(32字节)且使用__ALIGN_BEGIN,并禁用编译器优化或使用volatile。若涉及外部存储器(如SDRAM),需配置MPU为非缓存(或写-through)区域。实操建议:1)将双缓冲区定义为全局数组并加__attribute__((aligned(32)));2)在DMA传输前调用__DSB()和__ISB()确保指令同步;3)若使用外部RAM,在MPU中设置该区域为Normal, Non-cacheable;4)传输完成后,使用DMA中断标志确认数据就绪,再读取缓冲区。
mcuku 阿沐 · 2026-08-27