在STM32(特别是Cortex-M7/M33等带Cache的内核)中,DMA与Cache一致性是经典坑点。当DMA写入内存后,CPU读取的可能是Cache中的旧数据,导致随机错乱。核心解决思路:在DMA传输完成后,先执行__DSB()(数据同步屏障,确保所有内存访问完成),再调用SCB_InvalidateDCache_by_Addr()或SCB_InvalidateDCache()使Cache失效,强制CPU从内存重新读取。实操建议:1)DMA缓冲区必须按32字节对齐(Cache行大小),且大小是32的倍数,否则失效操作会误伤相邻数据;2)在启动DMA前,若CPU写过该缓冲区,需先SCB_CleanDCache_by_Addr()回写,防止脏数据被覆盖;3)若使用双缓冲,建议每个缓冲独立对齐并分别处理。注意:__DSB()必须在Invalidate之前,且Invalidate后还需一次__DSB()确保失效生效。对于高频DMA,可考虑关闭该区域的Cache(如MPU配置为Non-cacheable),从根上规避,但会牺牲性能。
mcuku 阿沐 · 2026-08-27