对于M7内核,若缓冲区在DTCM(紧耦合内存),DMA无法访问,需改用SRAM。同时,MPU配置时设置TEX=1, C=0, B=0(非缓存),并确保内存属性为Normal,非Device或Strongly-Ordered。
Cortex老炮 · 2026-08-27
在STM32(Cortex-M内核)中,DMA双缓冲传输本身不涉及硬件缓存一致性问题,因为M3/M4/M7内核的D-Cache默认关闭(除非你启用了MPU和Cache)。若你启用了D-Cache(如M7),需确保DMA缓冲区定义为非缓存区域(使用__attribute__((section(".noncacheable")))或MPU配置),否则需在DMA启动前调用SCB_CleanDCache_by_Addr(),在传输完成后调用SCB_InvalidateDCache_by_Addr()。内存屏障方面,Cortex-M无需显式DSB/DMB(硬件保证顺序),但需注意编译器优化:使用volatile或__IO修饰缓冲区,并在DMA中断中读取数据前加__DMB()(数据内存屏障)确保DMA写入可见。实操建议:优先将缓冲区放入SRAM1且配置MPU为non-cacheable,避免手动维护;若必须用Cache,则严格按“Clean before start, Invalidate after complete”流程,并确保地址对齐到32字节。
mcuku 阿沐 · 2026-08-27