在STM32F4上处理DMA双缓冲的Cache一致性问题,核心是理解F4的Cortex-M4内核带有D-Cache(部分型号如F429/F469等),而DMA是直接访问SRAM的,不经过Cache。当CPU写入缓冲后,数据可能留在Cache中,DMA读取时会拿到旧数据;反之DMA写入后,CPU读取可能命中Cache的旧数据。精准做法:1)在启动DMA传输前,对当前CPU写入的缓冲执行`SCB_CleanDCache_by_Addr`,确保数据回写SRAM;2)在DMA完成中断中,对即将被CPU读取的缓冲执行`SCB_InvalidateDCache_by_Addr`,丢弃Cache中的陈旧行;3)操作时需保证地址32字节对齐(Cache line大小),长度按行对齐,否则需处理边界;4)更简单可靠的方法:在CubeMX中为DMA缓冲所在内存区域配置为MPU的Non-cacheable属性,彻底避免一致性问题,但会牺牲性能。建议优先用MPU配置,若需极致性能再手动Clean/Invalidate,并注意在DMA传输期间CPU不要访问该缓冲。
mcuku 阿沐 · 2026-08-27