在STM32F4上启用D-Cache后,DMA与外设交互时,若DMA写入内存而CPU通过Cache读取,或反之,会导致数据不一致。精准规避需在每次DMA传输前后操作Cache。具体步骤:1) DMA发送前,若数据由CPU写入(如从SRAM缓冲区),调用SCB_CleanDCache()清刷该缓冲区,确保数据落回物理内存,再启动DMA。2) DMA接收后,先调用SCB_InvalidateDCache()使缓冲区对应的Cache行失效,再让CPU读取,避免读到陈旧数据。3) 操作需按缓冲区地址和大小对齐到32字节(Cache行大小),否则可能误刷相邻数据。建议使用__ALIGN_BEGIN修饰缓冲区,并封装函数如cache_clean_buffer(addr, size)和cache_invalidate_buffer(addr, size),内部调用SCB_CleanDCache_by_Addr或SCB_InvalidateDCache_by_Addr,确保精准。注意,若缓冲区小于32字节,需整行操作,可扩大对齐区域。实际项目中,我常用DMA双缓冲配合中断,在传输完成回调中先Invalidate再处理数据,实测可消除随机错乱。
mcuku 阿沐 · 2026-09-04