DMA是MCU一个非常重要的部分,它提供了一种直接、高效、快速的方式来传输数据,而不需要CPU的介入,大大提高了MCU的工作效率。
我们先来看一下没有DMA,数据是怎么流动的。
如图所示,红色线表示外设数据的读写,蓝色线表示内存数据的读写。数据必须要先加载到内核,然后再通过内核写入外设或内存,读写操作都需要内核做很多工作,虽然C代码可能就一行语句,但是汇编可不止一条。我们知道在程序执行的过程中这样的数据传输操作非常频繁,如果都这样处理,内核将花费太多时间在搬运数据上,无法集中精力处理更为重要的计算和中断事件,处理速度和效率就会非常的低。
使用DMA后,数据的流动变成了下图所示方式。
数据的传输工作由DMA控制器接管,假如我们配置由外设到内存,那么外设的数据一旦准备好,DMA就会自动将数据搬运到内存,内核只需要直接读取内存就可以获取到最新的外设数据。反过来也是同样的道理。整个传输过程不需要内核的参与,如果数据量很大,DMA的优势会非常明显。
内核有点像一个工厂,SRAM类似仓库,DMA就是物流。如果没有“物流”,这个“工厂”就需要自己进货、入库、出库、发货,而如果有了“物流”,“工厂”就不需要进货和发货了,这对“工厂”的生产效率有质的提升。
在STM32中,DMA控制器有多个通道,每个通道对应某几个外设,使用前需要指定好该通道给哪个外设使用。
具体使用DMA需要做下面的配置操作:
1、 使能DMA时钟
2、 配置外设和内存地址
3、 配置传输的数据个数
4、 配置通道的优先级
5、 配置数据传输方向
6、 配置circular模式或normal模式
7、 配置外设/内存incremented模式
8、 配置外设/内存数据位数
9、 配置中断,编写中断服务程序
10、使能DMA传输
之后内核只需要等待DMA中断的到来即可,然后读写内存数据。DMA有四种中断标志:全局中断、传输完成中断、半传输中断、传输错误中断,清除全局中断标志可以将所有的中断标志位清零。
DMA的外设和内存的数据位数可以不同,不同的位数传输最终的结果如下表所示:
使用STM32的LL库的代码如下:
1、 打开时钟
2、 配置地址
这里ADC是外设。
3、 数据个数
4、 优先级
5、 传输方向
6、 Circular模式
7、 Incremented模式
这里外设只有一个寄存器,所以不需要increment,内存是一个数组,所以要increment。
8、 数据位
数据位可以是8位(BYTE)、16位(HALFWORD)、32位(WORD)
9、 中断相关
10、 使能DMA
-
mcu
+关注
关注
146文章
17370浏览量
352987 -
cpu
+关注
关注
68文章
10922浏览量
213280 -
内存
+关注
关注
8文章
3071浏览量
74414 -
STM32
+关注
关注
2274文章
10929浏览量
358004 -
dma
+关注
关注
3文章
566浏览量
101100
发布评论请先 登录
相关推荐
STM32实例教程-DMA实验
![<b class='flag-5'>STM32</b>实例教程-<b class='flag-5'>DMA</b>实验](https://file1.elecfans.com/web2/M00/88/98/wKgaomRtZt6AZ9QeAABSXINlz74645.png)
ADC与DMA简介
STM32的DMA简介
1. stm32 mcu简介
![1. <b class='flag-5'>stm32</b> mcu<b class='flag-5'>简介</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于STM32F407的DMA解析-ADC单通道DMA读取数据
![基于<b class='flag-5'>STM32</b>F407的<b class='flag-5'>DMA</b>解析-ADC单通道<b class='flag-5'>DMA</b>读取数据](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F1开发指南笔记32----DMA
![<b class='flag-5'>STM32</b>F1开发指南笔记32----<b class='flag-5'>DMA</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32串口DMA发送数据
![<b class='flag-5'>STM32</b>串口<b class='flag-5'>DMA</b>发送数据](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Stm32之DMA直接内存读取(2021-07-30)
![<b class='flag-5'>Stm32</b>之<b class='flag-5'>DMA</b>直接内存读取(2021-07-30)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【DMA】浅谈STM32F4xx的DMA(附初始化代码)
![【<b class='flag-5'>DMA</b>】浅谈<b class='flag-5'>STM32</b>F4xx的<b class='flag-5'>DMA</b>(附初始化代码)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论