在STM32F4系列(Cortex-M4,无L1 Cache)中,DMA传输本身不涉及Cache一致性问题,因为M4内核没有数据缓存(DCache)。但若你使用外部SDRAM或通过DMA访问内存映射外设,需注意总线缓冲。精准处理的关键是:1)确认你的F4型号(如F429/F439带L1 Cache,而F407/F411不带),若带Cache,则需在DMA写内存后、CPU读取前调用SCB_InvalidateDCache_by_Addr(地址对齐32字节),在CPU写内存后、DMA读取前调用SCB_CleanDCache_by_Addr。2)边界处理:确保DMA缓冲区地址和大小均为32字节对齐(Cache line大小),否则需手动处理首尾非对齐部分。3)时机:在DMA传输完成中断中,先调用SCB_InvalidateDCache_by_Addr(仅对接收缓冲区),再读取数据;发送时,在启动DMA前调用Clean。实操建议:使用__ALIGN_BEGIN修饰缓冲区,并封装DMA传输函数,统一管理Cache操作,避免遗漏。
mcuku 阿沐 · 2026-08-27