DMA是STM32中最能显著降低CPU负载的硬件机制之一,但它真正难的地方并不是“怎么开启DMA”,而是如何让DMA、CPU、中断和内存缓冲区在整个数据生命周期内正确协同。
很多DMA问题并不会立即暴露,而是表现为“偶尔丢一个字节”“偶发数据错乱”“高速采样时才出问题”。这类问题的本质,往往不是DMA本身坏了,而是传输模式、缓冲区生命周期、CPU处理速度以及缓存一致性之间发生了竞争。
一、DMA真正解决的是什么问题?
传统外设通信中,CPU需要不断参与数据搬运。
例如UART接收一个字节:
UART接收到数据
↓
产生中断
↓
CPU进入中断
↓
CPU读取数据寄存器
↓
CPU写入内存
↓
退出中断
如果通信速率较高,CPU会频繁进入中断,真正消耗CPU的不是“处理数据”,而是搬运数据本身。
DMA则把数据搬运工作交给独立的DMA控制器:
┌──────────────┐
│ CPU │
│ 执行其他任务 │
└──────┬───────┘
│ 配置
↓
