STM32 DMA为什么“越配越玄学”?

📅 2026/8/25 23:38:56
STM32 DMA为什么“越配越玄学”?
DMA看起来只是“帮CPU搬数据”,但真正进入项目后,很多问题都不是DMA本身不会工作,而是DMA的工作节奏与CPU的数据处理节奏没有匹配起来。尤其是在STM32项目中,下面几类问题非常典型:UART DMA接收一段时间后突然丢数据;Circular模式明明一直开着,数据却被覆盖;ADC采样偶发出现异常值;STM32F7/H7上DMA收到的数据明明正确,CPU读出来却是旧数据;HAL回调没有触发,但DMA实际上已经收到了数据;DMA停止后偶尔出现半帧、残帧。这些问题背后的本质,可以归结为一句话:DMA不是简单的“自动搬运工”,而是一个独立于CPU运行的数据通道。真正需要设计的是:谁产生数据、谁搬运数据、谁消费数据,以及三者之间如何同步。一、先搞清楚:DMA到底替CPU做了什么?传统外设接收数据时,可以采用CPU轮询或者中断方式。例如UART每收到一个字节,CPU都需要读取数据寄存器:UART接收 ↓ 产生中断 ↓ CPU进入中断 ↓ 读取UART数据寄存器 ↓ 写入RAM ↓ 退出中断数据量一大,CPU就会不断被这种“搬一个字节”的工作打断。DMA则把