STM32的DMA简介

描述

DMA是MCU一个非常重要的部分,它提供了一种直接、高效、快速的方式来传输数据,而不需要CPU的介入,大大提高了MCU的工作效率。

我们先来看一下没有DMA,数据是怎么流动的。

dma

如图所示,红色线表示外设数据的读写,蓝色线表示内存数据的读写。数据必须要先加载到内核,然后再通过内核写入外设或内存,读写操作都需要内核做很多工作,虽然C代码可能就一行语句,但是汇编可不止一条。我们知道在程序执行的过程中这样的数据传输操作非常频繁,如果都这样处理,内核将花费太多时间在搬运数据上,无法集中精力处理更为重要的计算和中断事件,处理速度和效率就会非常的低。

使用DMA后,数据的流动变成了下图所示方式。

dma

数据的传输工作由DMA控制器接管,假如我们配置由外设到内存,那么外设的数据一旦准备好,DMA就会自动将数据搬运到内存,内核只需要直接读取内存就可以获取到最新的外设数据。反过来也是同样的道理。整个传输过程不需要内核的参与,如果数据量很大,DMA的优势会非常明显。

内核有点像一个工厂,SRAM类似仓库,DMA就是物流。如果没有“物流”,这个“工厂”就需要自己进货、入库、出库、发货,而如果有了“物流”,“工厂”就不需要进货和发货了,这对“工厂”的生产效率有质的提升。

在STM32中,DMA控制器有多个通道,每个通道对应某几个外设,使用前需要指定好该通道给哪个外设使用。

dma

具体使用DMA需要做下面的配置操作:

1、 使能DMA时钟

2、 配置外设和内存地址

3、 配置传输的数据个数

4、 配置通道的优先级

5、 配置数据传输方向

6、 配置circular模式或normal模式

7、 配置外设/内存incremented模式

8、 配置外设/内存数据位数

9、 配置中断,编写中断服务程序

10、使能DMA传输

之后内核只需要等待DMA中断的到来即可,然后读写内存数据。DMA有四种中断标志:全局中断、传输完成中断、半传输中断、传输错误中断,清除全局中断标志可以将所有的中断标志位清零。

DMA的外设和内存的数据位数可以不同,不同的位数传输最终的结果如下表所示:

dma

使用STM32的LL库的代码如下:

1、 打开时钟

dma

2、 配置地址

dma

这里ADC是外设。

3、 数据个数

dma

4、 优先级

dma

5、 传输方向

dma

6、 Circular模式

dma

7、 Incremented模式

dma

这里外设只有一个寄存器,所以不需要increment,内存是一个数组,所以要increment。

8、 数据位

dma

数据位可以是8位(BYTE)、16位(HALFWORD)、32位(WORD)

9、 中断相关

dma

dma

10、 使能DMA

dma

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分