欢迎光临
我们一直在努力

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则把

赞(0)
未经允许不得转载:171主机测评 » STM32 DMA为什么“越配越玄学”?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址