[其他ST产品]

stm32 DMA理论+实践

[复制链接]
1700|82
手机看帖
扫描二维码
随时随地手机跟帖
范德萨发额|  楼主 | 2023-11-25 12:10 | 显示全部楼层 |阅读模式
理论知识
1 DMA描述
5361656173b5cfff0.png

DMA就是一个数据搬运工,它不需要CPU的干预就能自动帮你搬运数据,也就不会占用你的时间,如果有很多数据要搬运,DMA就能直接帮你般,但是不用DMA就会CPU自己搬就好有很长的阻塞时间。

stm32有两个DMAstm32有两个DMA,每个外设都有单独的DMA通道,但是一个DMA下所有通道又是同用一个传输通道,所以并不能同时传输也是分先后的。但是也得分芯片型号,并不是所有型号都有两个DMA通道的好吧。

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:10 | 显示全部楼层
2 存储器映像

32746656173c6be660.png

存储器的映射这里映射了32位的地址,总共是4G的地址,STM32内存一般才几十K,几百K,所以肯定能存进去,但是这也造成了大部分的地址都没存东西,这里看个大概位置就行。

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:11 | 显示全部楼层
DMA框图
这个其实算是整体的时钟图,但是也能很好的看出DMA的运行,下面分开讲

81395656173db6de90.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:11 | 显示全部楼层
首先是两个DMA
53817656173eee4013.png
这里明确说明DMA有两个并且,DMA1有7通道,2有5个通道,然后还有个仲裁的存在,就是上面说过的,其实一个DMA共用一个传输通道,所以需要仲裁他们到底谁传。

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:11 | 显示全部楼层
主动单元与被动单元
155656561740038160.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:11 | 显示全部楼层
这里将上面这部分分别划分为了1234  其中1 2 3为主动单元,享有访问权和控制权4为被动单元,只能被访问。(首先是1 Dcode这个设备是专门用来访问Flash的  2为系统总线访问各个外设  3为DMA了,因为DMA要在各个存储器之间搬运数据,所以他也享有主动权。

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:12 | 显示全部楼层
DMA挂在在哪里
既然是个外设,那应该就有相应的寄存器,可以让处理器来操作他,可以看出来两个DMA都是直接挂在在了AHB总线上的,并且还有个以太网外设(因为以太网外设的DMA是单独的,所以并不算在我们这次要讲的DMA里面,但是他有自己的一条DMA通道。
631336561741cc66f9.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:12 | 显示全部楼层
DMA请求
DMA的开始指令有软件控制和硬件控制两种,其中如果只是存储器搬运到存储器那么可以软件控制,但是如果是存储器和外设,那么我们就要判断外设的数据是否处理完成,外设的处理完成之后我们才能去搬移他的数据。
967726561743048a6c.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:15 | 显示全部楼层
DMA逻辑图
(江科大的PPT)
8363656174f51574a.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:15 | 显示全部楼层
1 传输方向
可以从图上看出有三种模式

1) 外设寄存器到FLASH和SRAM(存储器

2) 存储器到外设寄存器

3 )存储器到存储器  

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:16 | 显示全部楼层
2 外设寄存器可配置的参数
外设寄存器和存储器寄存器都有三个可以配置的模式:1 起始地址  2数据宽度(这个可以配置3个,8位(字节)  16位(半字) 32位(字)  3地址是否自增(就传输完成一个,地址+1 就和指针是差不多的 499086561750d13296.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:16 | 显示全部楼层
3 传输计数器和重载器
910665617519ed5c2.png

传输计数器:每传输一次计数器就会减1   自动重载,归0后是否重载计数器

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:17 | 显示全部楼层
4 选择器
90151656175396e957.png
M2M给1:软件触发   M2M给0:硬件触发

可以选择软件触发或者硬件触发:但是这个软件触发就是连续触发,一直触发将计数器剪到0,所以这个东西不能和自动重载一起开,不然会一直减,和硬件不一样,硬件是触发一次减一次。

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:17 | 显示全部楼层
5 DMA请求映像

12795656175558795f.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:17 | 显示全部楼层
这是DMA1的内部映像

70068656175655beca.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:17 | 显示全部楼层
1 是通道1的EN位 这个位控制了通道1的开关

2 是M2M位  如果M2M位1则为软件触发

在图中还有触发位的选择项。可以看看这个图,这个图看着比上面的舒服一点。

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:17 | 显示全部楼层
3427065617570c159a.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:18 | 显示全部楼层
6 数据传输 3941765617585eb937.png

这里是前面说的数据传输:说了有8 16 32位

如果源端数据宽度为8 目标数据宽度为8 传输数目为4  写B0到目标  收到的就为B0

如果是8位到16位  收到的就会是00B0.16到8就会只有B0(很明显,接收到的数据是以接收方的宽度来决定的)

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:19 | 显示全部楼层
二 代码部分
1 存储器传到存储器
1)存储地址测试
首先看一下前面说的存储器地址(首先你要知道一般的数据也就是变量会存在运行内存中,如果是不需要改变变量(静态常量)和函数及代码会存在程序存储器FLASH里面我们可以测试一下先,虽然后面我们是直接取地址,不需要知道数据的地址,但是可以先了解一下。

52892656175b95d087.png

使用特权

评论回复
范德萨发额|  楼主 | 2023-11-25 12:19 | 显示全部楼层
测试一下啊,定一个变量和常量测试一下地址

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

962

帖子

2

粉丝