文章目录
- 一、DMA介绍
- 1.概括
- 2.DMA由来
- 2.1程序传送方式
- 2.2中断传送方式
- 2.3DMA原理
- 3.DMA具有的功能
- 4.DMA传输方式
- 5.DMA主要特征
- 6.DMA处理
- 7.DMA工作框图
- 8.DMA工作传送过程
- 二、串口DMA方式发送数据
-
- 五、参考
一、DMA介绍
1.概括
DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。
2.DMA由来
2.1程序传送方式
程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式和条件传送方式两种。
-
无条件传送方式
微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。
-
查询(有条件)传送方式
查询传送也称为条件传送,是指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态,当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口电路中既要有数据端口,还要有状态端口。
其特点是接口电路简单,CPU利用率低(程序循环等待),接口需向CPU提供查询状态.适用于CPU不太忙,传送速度要求不高的场合.要求各种外设不能同时工作,外设处于被动状态.
2.2中断传送方式
中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,CPU再继续执行被暂停的程序。
其特点是CPU的利用率高,外设具有申请CPU中断的主动权,CPU和外设之间处于并行工作状态.但中断服务需要保护断点和恢复断点(占用存储空间,降低速度),CPU和外设之间需要中断控制器.适用于CPU的任务较忙、传送速度要求不高的场合,尤其适合实时控制中的紧急事件处理.
2.3DMA原理
DMA的出现就是为了解决批量数据的输入/输出问题。DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。这样数据的传送速度就取决于存储器和外设的工作速度。
通常系统总线是由CPU管理的,在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。
其特点是接口电路复杂,硬件开销大.大批量数据传送速度极快.适用于存储器与存储器之间、存储器与外设之间的大批量数据传送的场合.
3.DMA具有的功能
根据其特点,DMA具有以下功能
1、能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
2、当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
3、能对存储器寻址及能修改地址指针,实现对内存的读写;
4、能决定本次DMA传送的字节数,判断DMA传送是否借宿。
5、发出DMA结束信号,使CPU恢复正常工作状态。
4.DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
- 外设到内存
- 内存到外设
- 内存到内存
- 外设到外设
DMA控制器提供两个AHB主端口:AHB内存端口(用于连接到内存)和AHB外设端口(用于连接到外设)。 但是,为了允许内存到内存的传输,AHB外设端口也必须可以访问内存。AHB从端口用于对DMA控制器的编程控制(仅支持32位访问)。
5.DMA主要特征
-
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置;
-
在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
-
独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
-
支持循环的缓冲器管理;
-
每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
-
存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
-
闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
-
可编程的数据传输数目:最大为65535。
6.DMA处理
对于两个DMA控制器的系统实现如下图所示。DMA1控制器AHB外设端口没有像DMA2控制器那样连接到总线矩阵,所以只有DMA2能够执行内存到内存的数据传输
7.DMA工作框图
上方的框图,我们可以看到STM32内核,存储器,外设及DMA的连接,这些硬件最终通过各种各样的线连接到总线矩阵中,硬件结构之间的数据转移都经过总线矩阵的协调,使各个外设和谐的使用总线来传输数据。
8.DMA工作传送过程
二、串口DMA方式发送数据
1.题目要求
STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。
2.工程建立
新建工程的步骤参考我之前的博客stm32CubeMX的安装和点亮流水灯
同样设置RCC为高速时钟源
设置usart1使能中断
以上两个步骤同前一篇博客中断内容
下面是关于DMA的设置
在USART1处选择DMA Settings点击Add添加新的通道
将两个输入输出管脚的传输速率设置为medium
下面自动为我们设置的默认的参数为normal,我们不做更改
接下来在右侧预览界面点击System viem选择DMA,在左侧添加ADD通道,
最后配置时钟源,选择72Mhz
导出工程
3.代码编写
进入mdk,在main.c用户代码中添加如下代码:
uint8_t Senbuff[] = "Hello Windows!";
这一句的意思是我们定义uint8_t Senbuff这个数组为hello windows,接下来我们会在main中使用到这个数组。注意这句要放在main函数体内,但不是循环体,具体位置如下:
然后就是我们main.c循环体内容的书写
我们在main.c 中while循环内输入如下代码:
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
可以看到这两句代码使用到了我们前面定义的数组,
第一句是设置发送的内容为数组unit8_t,发送方式为DMA。
这里sizof函数是一种内存容量度量函数,功能是返回一个变量或者类型的大小。
第二句是一个延时函数,延时1000ms也就是1s。
下面我们编译测试看有没有问题。
编译结果没有问题我们就可以进行测试了
4.烧录测试
打开串口助手查看:
可以看到成功发送Hello Windows,看前面的发送时间可以看到间隔为1s。
五、参考
传送的控制方式有哪几种
DMA原理介绍
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)