DMA控制器原理详解

article/2025/5/19 22:53:56

目录

工作原理

DMA硬件架构

DMA通道的作用

DMA寄存器

DMA出现的目的


工作原理

DMA全拼Direct Memory Access(直接内存存取),在传统的CPU存取数据时会先将数据放到缓存寄存器中然后在写入到指定位置

CPU存取数据流程图:

CPU经历了三个步骤,先将内存中指定位置上的数据取到数据缓存器中,然后在将数据缓存器中的内容写入到内存中,总共用了三步来完成内存两天不同地址上的数据写入

而使用DMA之后就会变得非常简单,DMA不会放入暂存器,而是直接写入写入内存,你只需要设置好源地址,目标地址,传输量,那么DMA就会开始传输数据,但DMA会占用你设备的总线,也就是这个过程中你无法使用总线,需要进行一个控制权转移,这样虽然传输变快了但是传输期间CPU基本上做不了别的事情,但是有些架构已经为DMA提供了一套自己的总线,在DMA传输过程中CPU依然可以控制外设,这个控制权转移不是一直DMA有效的,为了保证CPU也能正常通过系统总线去控制外设,一般会给DMA一定时间然后控制权在切回CPU,然后CPU处理一段时间在切回DMA直到DMA结束才会停止控制权转移。

DMA硬件架构

以下取自STM32芯片手册中对DMA的框架描述

 

  • 从上图可以看到DMA是一个单独的控制器,并且它有两个,挂设在AHB总线上,可以看到DMA1 CH1 - CH7也就是可配置的控制通道而DMA2只有5个,CPU通过配置DMA来完成数据传输
  • 可以看到它们不是使用System总线,而是使用了DMA自己的控制总线,所以这个架构会比使用系统总线的架构要快许多,但是功耗要大于使用系统总线的架构

以下是两个DMA控制器的结构图,可以清晰的看到每个通道用于做什么的

 DMA1

DMA2

DMA通道的作用

通道是一个小型的IO控制器,每个通道对应控制不同的外设、Memory,可以通过MCU数据手册里查看你的DMA里的每个通道对应控制的外设。

从上图给出的通道结构图中可以看到每个通道IO都支持Uart、SPI、I2C外设功能,值得注意的是这里外设是有编号的,可以在上图通道中看到,不同的外设由不同的通道程序来控制,如你使用I2C2外设,则需要找到支持I2C2的通道并使用它,其中也可以看到SW trigger (MEM2MEM BIT)这个意思代表支持Memory到Memory之间的通讯,如内部的Sram到Sram,也可以看到上图中有HW request 4 意味着这个通道支持中断通知,意思是当这个通道开始工作时会设置对应寄存器里的值,然后产生中断,我们可以在对应的中断标志寄存器里读到哪个通道产生了中断,以及做了什么事情

如果是对外设进行控制的话记得,如果是内部的Memory到Memory之间传输数据的话可以随便选择一个通道,因为从上图的结构可以看出每个通道IO都支持内部Memory

通道可以理解成一个小型的程序,它是一个简单的IO控制程序,只能处理对应外设之间的数据传输,工作之前需要配置DMA里使用哪个通道。

注意DMA每次工作只有一个通道工作,不能同时工作,通过特定寄存器来设置通道优先级,当发出通道请求时DMA控制器会根据优先级选择优先调度哪个通道工作。

补充

内存到内存

大家需要注意一下,虽然DMA通道支持内存到内存的,但是需要仔细看一下芯片手册里对DMA的设计介绍,STM32的设计里有些区别,如DMA1不支持内存到内存,但支持内存到外设,外设到内存,DMA2支持内存到内存,也支持外设到内存,内存到外设。

这里说一下为什么,这个跟设计有关,前面说过每个通道都相当于一个IO口,每个通道都有一段代码在里面,这个代码实现是不一样的,DMA1的通道就不支持内存到内存的工作模式,而DMA2的通道代码是支持内存到内存的,同时它是接在总线矩阵上的(BUS Matrix)。

这里说一下什么是总线矩阵,DMA的工作是比较单一的,它每次访问总线都需要仲裁器来申请总线控制权,如果从内存到外设,首先先申请内存的总线控制权,然后在拿到数据在申请外围设备的总线控制权,这里切换就很耗时,所以推出了BUS Matrix,由DMA仲裁先获取外围的控制权,然后通过交联矩阵总线去取SRAM的数据,取到以后在发给外围,这样就不需要仲裁切换了,时间比较快

原理图上没有给出接法,但是我在一些芯片手册里看到了STM的注释

大家可以看到最下面的英文:The DMA1 controller AHB perlpheral port is not connected to the bus matrix like DMA2 controller AS a result only DMA2 streams are able to perform memory-to-memory transfers

翻译:DMA1控制器AHB端口没有像DMA2控制器一样连接到总线矩阵,因此只有DMA2流能够执行内存到内存的传输

但是DMA1是可以支持内存到外设的,它不通过总线矩阵去做这个事情,也就是说内存到外设会有仲裁器的切换,所以比较耗时。

外设请求

这里大家注意一下,这里不是通道接线,这里是通道支持的信号源,比如我想内存到外设,那么可以看到通道3上有SPI_TX也就支持往SPI里写数据,如果是从SPI读数据就需要这个通道支持SPI_RX,这里以内存到外设来说,当内存到外设时,需要先配置好DMA,让其工作,工作模式指定为内存到外设,目标地址指定为外设的DR缓存寄存器,其次要关闭目标地址的累加,因为外设的DR寄存器一般只有8位一个字节,跟总线位宽是挂钩的,如果你地址增加了就不是这个寄存器了,DMA每次只能传输一个字节过去,跟位宽有关,当你传输了一个字节到外设的寄存器里以后你地址增加了那么就不是这个DR寄存器了,DMA会自己累加地址的。

当通道工作以后需要外设去请求数据,DMA不会主动去发送数据,需要外设先发送请求,然后在由DMA产生应答,然后外设在回复应答,那么此时DMA才会开始传输,每传输一个字节都会有相应的标志位,外设可以通过读取这个标志位来从DR里取数据,有的时候DMA会比较快,所以有一个暂停位,当外设读到有新字节来之后先设置暂停位,然后将字节读走,在发送恢复信号让DMA继续传输,当传输完之后DMA会自动置完成位,通过读取这些位来跟DMA做交互,每个外设里都有相关寄存器对DMA的支持,详细可以查看芯片手册上的功能介绍。

其次需要设置DMA的目标地址不自动增加,因为DMA每次只传一个字节过去(与位宽相关),传输一个字节过去之后会将偏移地址自动累加1,因为外设是需要放入DR寄存器里的,DR寄存器只有一个,所以发送一个字节后地址自动累加以后就不是DR寄存器了,这点需要注意。

优先级

最右侧的是优先级,默认是通道编号越低的优先级越高,这里优先级是由仲裁器完成的,同一时间下可能有许多请求,那么只能有一个响应,仲裁器会选择一个优先级最高的通道执行,优先级是可以设置的,优先级值越低优先级越高,如果遇到优先级一样的就选通道编号最低的执行

仲裁器

每个DMA都有仲裁器,它的作用是负责选中一个通道来使用DMA的AHB系统总线

 

DMA寄存器

 可以看到可以通过上面的通道来配置Uart、SPI、I2C的一些功能,同时看到Internal/Request是内部带有中断功能的,具体如何配置还需要看寄存器功能

寄存器介绍

① 中断类

寄存器名

作用

DMA_ISR

中断状态寄存器

DMA_IFCRDMA中断标志位清除寄存器

② 控制传输类

寄存器名

作用

DMA_CCRxDMA通道x配置寄存器 
DMA_CNDTRx

DMA通道x数据数量寄存器

DMA_CPARxDMA通道x外设地址寄存器
DMA_CMARxDMA通道x内存地址寄存器

需要注意上面的寄存器针对DMA1与DMA2都有对应的一组,它们俩不使用一组寄存器控制

可以简单把DMA理解成CPU的一个传输小帮手,CPU通过告诉DMA该传输哪些数据,然后由DMA去完成传输工作

DMA是一个独立的控制器,内部有小型芯片来控制的,也有自己的一套架构,一般集成在MCU内部与CPU紧密贴合

DMA出现的目的

DMA的出现就是为了解决CPU在处理大量数据传输时的时间耗费成本,在传输大数据时CPU会先放到暂存器中这样的速度会影响效率,速度较慢,同时CPU如果一直忙于传输数据就不能去做别的事情了,所以DMA的诞生解决了这个问题,需要值得注意的是在使用DMA之前要看下架构,DMA是否与CPU使用同一总线,若同一总线的情况下是会影响CPU工作效率而非传输效率


http://chatgpt.dhexx.cn/article/UMWuC1a0.shtml

相关文章

自动控制原理8.1---非线性控制系统概述

参考书籍:《自动控制原理》(第七版).胡寿松主编. 《自动控制原理PDF版下载》 1.非线性控制系统概述 1.1 研究非线性控制理论的意义 当系统中含有一个或多个具有非线性特性的元件时,该系统称为非线性系统; 随动系统实例说明: …

【经典控制理论】| 自动控制原理知识点概要(下)

参考资料 胡寿松《自动控制原理》第6版刘豹《现代控制理论》第3版斐润《自动控制原理》哈工大控制学科803考研资料 前文 【经典控制理论】| 自动控制原理知识点概要(上) 6. 线性系统的校正 6.1 综合和校正问题的提出 控制系统的综合和校正问题是在已知…

交流异步电机矢量控制(二)——矢量控制原理

前言:在前面梳理完电机数学模型和坐标变换的知识后,下一步就是对矢量控制系统的建立,矢量控制系统重在于其思想框架的理解以及异步电机独有多种磁场定向方案之间的区别,这两个问题都是值得独立探究的,按照顺序来。 本…

自动控制原理(一)

目录 一阶系统1.数学模型2.单位阶跃响应3.特性分析4.典型实例 二阶系统1.数学模型2.单位阶跃响应3.暂态响应的定量分析指标 高阶系统自动控制系统稳定性参考资料 一阶系统 1.数学模型 系统闭环传递函数入下图: 开环传函:积分环节 闭环传函:惯性环节 …

【知识点总结】自动控制原理(自控)

自动控制原理 总结内容: 内容包括: 控制系统的时域数学模型、控制系统的复数域数学模型、控制系统的结构图与信号流图、梅逊公式 、闭环系统传递函数、线性系统的时域分析法、一阶系统的时域分析、系统时间响应的性能指标、二阶系统的时域分析、线性系统…

通俗易懂的自动控制原理 # 绪论

1 自动控制系统的基本原理 1.1 引入以及定义 诸如:神舟10号发射升空、战斧式巡航导弹、装配机器人、自动泊车系统等其中都应用了自动控制的相关理论和技术。 什么是控制? 控制 - 使某个(某些)量按一定的规律变化某个&#xff0…

自动控制原理(来自于b站的笔记整理,深入理解自动控制框架)

一、自动控制原理 1 文章目录 一、自动控制原理 [^1]1. 控制原理1.1 开环与闭环系统1.2 稳定性分析[^2]1.3 一起燃烧卡路里/科学减肥(系统分析实例_数学建模部分)1.4 终值定理与稳态误差[^3]1)比例控制2)比例积分控制 1.5 根轨迹1…

《自动控制原理》个人笔记(来自ppt课件)

控制的含义 控制(CONTROL)----某个主体使某个客体按照一定的目的动作。 主体–人:人工控制; 机器:自动控制 客体–指一件物体,一套装置,一个物化过程,一个特定系统。 人工控制与自…

4. 吴恩达深度学习--优化算法

本文主要参考了 严宽 大神的学习笔记,并在其基础上补充了一点内容,点此查看原文。   本文所使用的资料已上传到百度网盘【点击下载】,提取码:hnwl ,请在开始之前下载好所需资料。   到目前为止,哦我们始…

吴恩达深度学习课程第二章第三周编程作业(pytorch实现)

文章目录 声明一、问题描述二、编程实现1.加载数据集2.使用mini-batch3.利用pytorch搭建神经网络3.1 利用torch.nn简单封装模型3.2 定义优化算法和损失函数 4.整体代码 声明 本博客只是记录一下本人在深度学习过程中的学习笔记和编程经验,大部分代码是参考了【中文】…

吴恩达深度学习L4W4人脸识别

1、One-shot learning 人脸识别往往每个人只有一张照片,因此不应该用卷积神经网络配合softmax训练。 应该选择学习 Similarity 函数。详细地说,你想要神经网络学习这样一个用𝑑表示的函数,𝑑(𝑖&#x1d45…

吴恩达深度学习Deep Learning课程笔记

1.1 前言 课程安排: 1.神经网络和深度学习 内容:神经网络的基础,如何建立神经网络、深度神经网络、以及如何在数据时训练它们 2.提升深度神经网络 内容:深度学习方面的实践,严密地构建神经网络以及提升其表现&…

吴恩达深度学习第一章第二周编程作业

文章目录 前言一、题目描述。二、相关库三、编程步骤1.数据预处理2.模型的封装3.模型的调用4.结果展示 总结 前言 本人处于初学阶段,编程能力有限,代码的编写参考了网上的大神。 一、题目描述。 我们需要训练得到一个逻辑回归分类器来对图片进行二分类&…

吴恩达深度学习之风格迁移

个人的学习笔记,一直更新中,如有错误,评论区见,冲冲冲! 笔记来源:吴恩达深度学习 4.6 什么是神经风格转换?_哔哩哔哩_bilibili 1 输入输出 风格迁移输入:内容(Conten…

吴恩达深度学习作业之deepleraning_L1W2_h1

#吴恩达《深度学习》L1W2作业1 知识点:numpy入门,函数向量化实现做完这个作业,你能学会:用ipython notebook 用numpy,包括函数调用及向量矩阵运算 理解“广播”的概念 向量化代码#我们很少在深度学习中使用“math”库。…

吴恩达深度学习编程作业报错解决方法汇总

概述及资源分享 大二结束后的暑假,学习吴恩达深度学习([双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili)的课程,在做编程作业的时候总是遇到一些报错,尤其是导入所需要的库的时候会报一些No model。。。的…

旧版吴恩达深度学习环境搭建(anaconda+tensorflow+jupyter notebook)(呕心沥血诚意之作)

本人在参考多位博主的文章后,多次尝试才成功配置了tensorflow1.2.1的环境(课程建议Python3.6tensorflow1.2.1Keras2.0.7)。在此之前,曾经尝试用tensorflow2.x降级的方法(import tensorflow.compat.v1 as tf&#xff09…

《吴恩达深度学习》编程作业-第二周

目录 1.题目:基于神经网络思维模式的逻辑回归 2.声明 3.知识回顾 4.Python编程分析 4.1.导入需要用的库 4.2.数据处理 4.2.1.读取数据(包括训练集和测试集) 4.2.2.取出数据(包括训练集和测试集,还有标签的值&a…

吴恩达 深度学习 2021版 作业

练习 神经网络与深度学习神经网络基础Numpy基础1-使用numpy构建基本函数 神经网络与深度学习 神经网络基础 Numpy基础 学习目标: 使用numpy,包括函数调用及向量矩阵运算广播向量化代码 1-使用numpy构建基本函数 1.1- sigmoid function和np.exp&…

吴恩达深度学习

最近在学习吴恩达老师的深度学习,边学边随手记一些东西,留个简单的笔记,以便日后复习。 第一周 结构化数据:每个特征都有清晰的定义 非结构化数据:音频、图像、文本等 大规模的神经网络大规模的带标签数据 第一周习题…