在STM32F4(Cortex-M4,无L1缓存)上,DMA双缓冲传输本身不涉及硬件缓存一致性问题,因为CPU和DMA都直接访问SRAM。但需注意编译器优化和写缓冲器(Write Buffer)可能引入的乱序。实操建议:1)确保DMA描述符和缓冲区数组用volatile修饰,防止编译器缓存变量;2)在启动DMA前,使用__DSB()(数据同步屏障)和__DMB()(数据内存屏障)确保CPU对缓冲区的写操作完成;3)在DMA传输完成中断中,先读取DMA状态寄存器(如NDTR)确认传输结束,再调用__DMB()后再访问数据;4)若使用MPU配置了SRAM为cacheable(默认无),需禁用或配置为write-through,并手动clean/invalidate。实际项目中,多数问题源于未加volatile或未在切换缓冲前同步,建议在DMA半传输/完成回调中先执行__DMB(),再处理数据。
mcuku 阿沐 · 2026-08-27