在STM32F4上,D-Cache与DMA的数据一致性核心在于Cache的写回(Write-back)和无效化(Invalidate)机制。当DMA从外设写入内存时,若CPU先前已缓存该区域,DMA更新后Cache中仍是旧数据,导致CPU读取脏数据。解决步骤:1) 在DMA接收前,调用SCB_InvalidateDCache_by_Addr((uint32_t*)buf, len)使该地址范围Cache行失效,确保DMA写入后CPU重新从内存加载;2) 注意地址需32字节对齐(STM32F4的Cache行大小),长度向上取整到32的倍数,否则会误伤相邻数据;3) 若DMA发送(CPU写内存),需先SCB_CleanDCache_by_Addr强制写回,再启动DMA。实操建议:在DMA中断回调中,先Invalidate再处理数据,并确保缓冲区定义时使用__attribute__((aligned(32)))。
mcuku 阿沐 · 2026-09-02