打印
[其他ST产品]

stm32 DMA理论+实践

[复制链接]
1266|82
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
理论知识
1 DMA描述


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

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

使用特权

评论回复
沙发
范德萨发额|  楼主 | 2023-11-25 12:10 | 只看该作者
2 存储器映像



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

使用特权

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

使用特权

评论回复
地板
范德萨发额|  楼主 | 2023-11-25 12:11 | 只看该作者
首先是两个DMA

这里明确说明DMA有两个并且,DMA1有7通道,2有5个通道,然后还有个仲裁的存在,就是上面说过的,其实一个DMA共用一个传输通道,所以需要仲裁他们到底谁传。

使用特权

评论回复
5
范德萨发额|  楼主 | 2023-11-25 12:11 | 只看该作者
主动单元与被动单元

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
9
范德萨发额|  楼主 | 2023-11-25 12:15 | 只看该作者
DMA逻辑图
(江科大的PPT)

使用特权

评论回复
10
范德萨发额|  楼主 | 2023-11-25 12:15 | 只看该作者
1 传输方向
可以从图上看出有三种模式

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

2) 存储器到外设寄存器

3 )存储器到存储器  

使用特权

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

使用特权

评论回复
12
范德萨发额|  楼主 | 2023-11-25 12:16 | 只看该作者
3 传输计数器和重载器


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

使用特权

评论回复
13
范德萨发额|  楼主 | 2023-11-25 12:17 | 只看该作者
4 选择器

M2M给1:软件触发   M2M给0:硬件触发

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

使用特权

评论回复
14
范德萨发额|  楼主 | 2023-11-25 12:17 | 只看该作者
5 DMA请求映像


使用特权

评论回复
15
范德萨发额|  楼主 | 2023-11-25 12:17 | 只看该作者
这是DMA1的内部映像

使用特权

评论回复
16
范德萨发额|  楼主 | 2023-11-25 12:17 | 只看该作者
1 是通道1的EN位 这个位控制了通道1的开关

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

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

使用特权

评论回复
17
范德萨发额|  楼主 | 2023-11-25 12:17 | 只看该作者

使用特权

评论回复
18
范德萨发额|  楼主 | 2023-11-25 12:18 | 只看该作者
6 数据传输

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

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

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

使用特权

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

使用特权

评论回复
20
范德萨发额|  楼主 | 2023-11-25 12:19 | 只看该作者
测试一下啊,定一个变量和常量测试一下地址

使用特权

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

本版积分规则

52

主题

935

帖子

2

粉丝