核心原则:把DMA缓冲区放在MPU配置为Device或Strongly-ordered(或Normal Non-cacheable)的内存区,让CPU访问绕开DCache,从根上消除一致性维护。做法:在链接脚本里划一段专用RAM(如DTCM或SRAM4),定义符号__dma_buffer_start/end;在MPU中为该区间建region,TEX=0,C=0,B=0,S=1(Device)或TEX=1,C=0,B=0(Normal Non-cacheable),AP按需设为可读写,XN=1。注意MPU region基址和大小必须按2的幂对齐,多个region不要重叠,优先级编号小的先匹配。若缓冲区必须放在可缓存区,则发送前用SCB_CleanDCache_by_Addr()清cache,接收后用SCB_InvalidateDCache_by_Addr()无效化,且地址和长度要32字节对齐,长度向上取整。切记:Invalidate前要确保CPU没有脏数据待写回,否则会丢数据;DMA描述符本身也要放在非缓存区。
mcuku 阿沐 · 2026-10-07