DMA 详解

DMA介绍、原理、工作模式 DMA,全称Direct Memory Access,直接存储器访问。DMA将数据从一个内存地址复制到另一个内存地址的操作,当然不仅仅局限于内存到内存,也可以外设和内存之间相互访问。那么DMA进行数据的搬移和普通通信方式(IIC、SPI)想比区别在哪,普通通信方式IIC或者SPI或多或少的到需要CPU的参与,CPU控制收发、读写,而DMA在进行数据传输的时候不需要CPU参与,因此大大降低了CPU的工作量。 阅读详情


一、简介

DMA(Direct Memory Access,直接存储器访问)顾名思义,就是绕开 CPU 直接访问 Memory。在计算机中,相比 CPU,Memory 和外设的速度是非常慢的,因而在 Memory 和 Memory (或者 Memory 和外设)之间搬运数据,非常浪费 CPU 的时间,造成 CPU 无法及时处理一些实时事件。因此,工程师们就设计出来一种专门用来搬运数据的器件——DMA 控制器(DMA Controller,DMAC),协助 CPU 进行数据搬运。


由上图可知,DMA 无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。

  • 使用 DMA,对于高速设备而言,如硬盘,它不只是降低 CPU 的使用率,而且还能大大提高硬件设备的吞吐量。
  • 因为对于这种设备,CPU 直接供应数据的速度太低。 CPU 一个总线周期最多只能存取一次总线,而且对于 ARM 设备,它不能把内存中 A 地址的值直接搬到 B 地址。它只能先把 A 地址的值搬到一个寄存器,然后再从这个寄存器搬到 B 地址。也就是说,对于 ARM,要花费两个总线周期才能将 A 地址的值送到 B 地址。
  • 而 DMA 就不同了,一般系统中的 DMA 都有突发(Burst)传输的能力,在这种模式下,DMA 能一次传输几个甚至几十个字节的数据,所以使用 DMA 能使设备的吞吐能力大为增强。

使用 DMA 时我们必须要注意如下几点:

  • DMA 使用物理地址,程序是使用虚拟地址的,所以配置 DMA 时必须将虚拟地址转化成物理地址
    因为程序使用虚拟地址,而且一般使用 Cache 地址,所以 Cache 中的内容与其物理地址(内存)的内容不一定一致,所以在启动 DMA 传输前一定要将该地址的 Cache 刷新,即写入内存
  • OS 并不能保证每次分配到的内存空间在物理上是连续的。尤其是在系统使用过一段时间而又分配了一块比较大的内存时。所以每次都需要判断地址是不是连续的,如果不连续就需要把这段内存分成几段让 DMA 完成传输

二、STM32 中的 DMA

刚才简单介绍了一下,什么是 DMA,下面结合实例,看一下 DMA 是怎么在 STM32 中使用的。

1、DMA 框图

这是 STM32F4xx 设备的 DMA 框图:

每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能通过软件来配置:

  1. 在同一个 DMA 模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求 0 优先于请求 1,依此类推);
  2. 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
  3. 支持循环的缓冲器管理;
  4. 每个通道都有 3 个事件标志(DMA 半传输、DMA 传输完成和 DMA 传输出错),这 3 个事件标志逻辑或成为一个单独的中断请求;
  5. 存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
  6. FLASH、SRAM、外设的 SRAM、APB1、APB2 和 AHB 外 设均可作为访问的源和目标;
  7. 可编程的数据传输数目:最大为 65535。

中间的 FIFO 区,每个数据流(总共 8 个数据流)都有一个独立的 FIFO,可以实现存储器接口到外设接口之间的数据长度非对齐传输。

1.1 传输方式

DMA 的作用就是实现数据的直接传输,而去掉了传统数据传输需要 CPU 寄存器参与的环节,主要涉及三种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。三种情况的数据传输如下:

  • 外设到内存)
  • 内存到外设
  • 内存到内存

DMA1 控制器 AHB 外设端口与 DMA2 控制器的情况不同,不连接到总线矩阵,因此,仅 DMA2 数据流能够执行内存到内存的传输

在发生一个事件后,外设向 DMA 控制器发送一个请求信号。DMA 控制器根据通道的优先权处理请求。当 DMA 控制器开始访问发出请求的外设时,DMA 控制器立即发送给它一个应答信号。当从 DMA 控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA 控制器同时撤销应答信号。DMA 传输结束,如果有更多的请求时,外设可以启动下一个周期。

总之,每次 DMA 传送由 3 个操作组成:

  1. 从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是 DMA_CPARx 或DMA_CMARx 寄存器指定的外设基地址或存储器单元;
  2. 存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是 DMA_CPARx 或 DMA_CMARx 寄存器指定的外设基地址或存储器单元;
  3. 执行一次 DMA_CNDTRx 寄存器的递减操作,该寄存器包含未完成的操作数目。

DMA 有以下两种传输方式:

  1. DMA_Mode_Normal(正常模式):当一次 DMA 数据传输完后,停止 DMA 传送 ,也就是只传输一次
  2. DMA_Mode_Circular(循环传输模式):当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式

1.2 仲裁器

仲裁器用于仲裁数据流 0~7 的请求优先级,保证数据有序传输。

仲裁器根据通道请求的优先级来启动外设/存储器的访问。优先权管理分2个阶段:

  1. 软件:每个通道的优先权可以在 DMA_CCRx 寄存器中设置,有 4 个等级:
    • 最高优先级
    • 高优先级
    • 中等优先级
    • 低优先级;
  2. 硬件:如果 2 个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。比如:如果软件优先级相同,通道 2 优先于通道 4。

注意: 在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。

1.3 数据流

仅限于 Cortex-M4 内核上有数据流

8 个 DMA 控制器数据流都能够提供源和目标之间的单向传输链路。每个数据流配置后都可以执行:

  • 常规类型事务:存储器到外设、外设到存储器或存储器到存储器的传输。
  • 双缓冲区类型事务:使用存储器的两个存储器指针的双缓冲区传输(当 DMA 正在进行自/至缓冲区的读/写操作时,应用程序可以进行至/自其它缓冲区的写/读操作)。要传输的数据量(多达 65535)可以编程,并与连接到外设 AHB 端口的外设(请求 DMA 传输)的源宽度相关。每个事务完成后,包含要传输的数据项总量的寄存器都会递减。

STM32F4xx 有两个 DMA:DMA1、DMA2,其请求映射如下表:

1.4 指针递增模式

根据 DMA_SxCR 寄存器中 PINC 和 MINC 位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值。

通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。

如果使能了递增模式,则根据在 DMA_SxCR 寄存器 PSIZE 或 MSIZE 位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增 1个数据宽度、2个数据宽度或 4个数据宽度。

1.5 存储器到存储器模式

DMA 通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。

当设置了 DMA_CCRx 寄存器中的 MEM2MEM 位之后,在软件设置了 DMA_CCRx 寄存器中的 EN 位启动 DMA 通道时,DMA 传输将马上开始。当 DMA_CNDTRx 寄存器变为 0 时,DMA 传输结束。存储器到存储器模式不能与循环模式同时使用。

这里要注意仅 DMA2 的外设接口可以访问存储器,所以仅 DMA2 控制器支持存储器到存储器的传输,DMA1 不支持。

1.6 DMA 中断

每个 DMA 通道都可以在 DMA 传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。

2、DMA 配置

经过刚才的介绍可以知道,要配置 DMA,大致要实现如下内容:

  1. 源地址(Source Address):源地址表示数据传输的起始地址,即外设设备中数据缓冲区的地址。DMA 将从这个地址开始读取数据。
  2. 目标地址(Destination Address):目标地址表示数据传输的目的地址,即系统内存中的指定地址。DMA 将数据传输到这个地址。
  3. 数据长度(Data Length):数据长度表示需要传输的数据大小。它可以以字节、字或者其他单位进行表示。
  4. 控制信息(Control Information):控制信息包括传输模式、中断使能等参数。在传输过程中,DMA 根据这些参数来控制数据的传输行为。
  5. DMA 通道选择(DMA Channel Selection):在具有多个 DMA 通道的系统中,选择要使用的 DMA 通道。
  6. DMA 传输模式(DMA Transfer Mode):指定DMA传输的模式,如单次传输模式、循环传输模式等。
  7. DMA 中断使能(DMA Interrupt Enable):用于控制 DMA 传输完成时是否产生中断。

下面的代码实现了 USART1 发送接口的 DMA 配置:

DMA_InitTypeDef DMA_InitStructure;

DMA_InitStructure.DMA_BufferSize           =   0;                               // 缓冲区大小   
DMA_InitStructure.DMA_Channel              =   DMA_Channel_4;                   // DMA通道4
DMA_InitStructure.DMA_DIR                  =   DMA_DIR_MemoryToPeripheral;      // 内存到外设
DMA_InitStructure.DMA_FIFOMode             =   DMA_FIFOMode_Disable;            // 禁用FIFO模式
DMA_InitStructure.DMA_FIFOThreshold        =   DMA_FIFOThreshold_1QuarterFull;  // FIFO阈值:1/4满
DMA_InitStructure.DMA_Mode                 =   DMA_Mode_Normal;                 // 正常模式
DMA_InitStructure.DMA_Memory0BaseAddr      =   0;                               // 内存源地址
DMA_InitStructure.DMA_MemoryDataSize       =   DMA_MemoryDataSize_Byte;         // 内存数据长度
DMA_InitStructure.DMA_MemoryBurst          =   DMA_MemoryBurst_Single;          // 单次传输
DMA_InitStructure.DMA_MemoryInc            =   DMA_MemoryInc_Enable;            // 内存地址自增
DMA_InitStructure.DMA_PeripheralBaseAddr   =   (uint32_t)&(USART1->DR);         // 外设地址
DMA_InitStructure.DMA_PeripheralDataSize   =   DMA_PeripheralDataSize_Byte;     // 外设数据长度
DMA_InitStructure.DMA_PeripheralBurst      =   DMA_PeripheralBurst_Single;      // 单次传输
DMA_InitStructure.DMA_PeripheralInc        =   DMA_PeripheralInc_Disable;       // 外设地址不自增
DMA_InitStructure.DMA_Priority             =   DMA_Priority_Medium;             // 中等优先级

DMA_Init(DMA2_Stream7, &DMA_InitStructure);
DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
DMA_Cmd(DMA2_Stream7, DISABLE);

中断函数如下:

void DMA2_Stream7_IRQHandler(void)
{
    if (DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) != RESET)
    {
        DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
        ...
    }
}
DMA的解读 直接存储器访问(Direct Memory Access),简称DMA。前述的对I/O设备的数据搬运操作,无论是轮询方式还是中断方式,都需要CPU读写参与其中,在要进行大量数据传输时,CPU的利用效率将大大降低;DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。 阅读详情

相关推荐

【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)

【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)

challenglistic的博客 5万+

DMA简介

为什么要有 DMA 技术? dma主要是用于读写数据用的 在没有 DMA 技术前,I/O 的过程是这样的: CPU 发出对应的指令给磁盘控制器,然后返回; 磁盘控制器收到指令后,于是就开始准备数据,会把数据放入到磁盘控制器的内部缓冲区中,然后产生一个中断; CPU 收到中断信号后,停下手头的工作,接着把磁盘控制器的缓冲区的数据一次一个字节地读进自己的寄存器,然后再把寄存器里的数据写入到内存,而在数据传输的期间 CPU 是无法执行其他任务的。 可以看到,整个数据的传输过程,都要需要 CPU 亲自.

羞羞滴小朋友 2万+

Cadence Allegro PCB文件对比实战:3分钟搞定两份设计差异(附颜色标注技巧)

本文详细介绍了如何高效使用Cadence Allegro的Design Compare功能进行PCB文件差异对比。通过实战工作流,可在3分钟内精准定位并理解两份设计在布局、布线、元件等方面的关键差异,并分享了自定义颜色标注技巧,帮助工程师快速聚焦重要修改,提升设计评审与团队协作效率。

weixin_29248653的博客 376

DMA外设详解

存储器到存储器,存储器到外设,外设到存储器以及串口空闲中断深入理解

k666499436的博客 3万+

Windows下用Docker部署RagFlow的5个常见错误及解决方法(附详细日志分析)

本文针对Windows系统下使用Docker部署RagFlow的常见难题,提供了详细的避坑指南。文章深度剖析了WSL2配置、端口冲突、文件权限、资源限制及网络通信这五个典型错误场景,并结合具体日志分析,给出了经过验证的解决方案,帮助开发者高效完成部署。

weixin_29233857的博客 178

以太网传输硬件设计大全

1.网线的介绍RJ45由插头和插做组成,也就是我们常说的网口和网线。RJ45 网线插头又称水晶头,共有八芯做成。RJ45网络传输线分为直通线、交叉线和全反线。直通线用于异种网络设备之间的互连,例如,计算机与交换机。交叉线用于同种网络设备之间的互连,例如,计算机与计算机。全反线用于超级终端与网络设备的控制物理接口之间的连接。下面将介绍一下各线的作用和区别。1.直通线:又叫正线或标准线,两端采用568B做线标准,注意两端都是同样的线序且一一对应。直通线是应用最广泛,现在最常用的线。

weixin_45365488的博客 6748

DMA原理,步骤超细详解,一文看懂DMA

DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?

qq_41854911的博客 1万+

从原理到实践:详解RGBD相机深度与彩色图像对齐(D2C)算法

本文深入解析了RGBD相机深度与彩色图像对齐(D2C)算法的原理与实现。针对自组装相机中深度图与彩色图不匹配的核心痛点,文章从相机模型、坐标系变换等数学基础讲起,剖析了传统点映射算法的缺陷,并重点介绍了高效的矩形区域映射算法。该算法通过将深度像素视为矩形区域进行映射,有效解决了空洞和遮挡问题,并附有可直接复用的C++代码与优化技巧,为三维重建、机器人视觉等应用奠定坚实基础。

weixin_28363123的博客 241

DMA详解

DMA本来不属于CPU体系架构部分的内容,只因为在开发中经常要用到其相关的知识,所以这里就其基本概念、工作原理、常见问题做一个总结。 DMA概述 DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问。DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA控制接口逻辑芯片共同组成,嵌入式系统的DMA控制器内建在处理器芯片内部,一般称为DMA控制器,DMAC)。 DMA内存访问

Yonx 1万+

Fluent DPM模型保姆级教程:三通管颗粒流动模拟,从网格导入到轨迹图生成

本文提供Fluent DPM模型在三通管颗粒流动模拟中的保姆级教程,涵盖从网格导入到轨迹图生成的全流程。通过详细步骤和参数设置,帮助用户掌握DPM模型在颗粒流动模拟中的关键技巧,适用于化工、能源等领域的工程应用。

weixin_30615767的博客 578

PyTorch深度学习实战(41)——循环神经网络与长短期记忆网络

循环神经网络 (Recurrent Neural Network, RNN) 通过将前一个时间步的隐藏状态作为当前时间步的输入,实现对序列数据的建模,由于循环连接的存在,RNN 能够捕获时间依赖关系,然而,RNN 在处理长期依赖性问题时会遇到困难。为了解决这个问题,提出了 LSTM,通过引入门控机制改进 RNN 来有效地处理长期依赖关系。在本节中,了解了 LSTM 和 RNN 的基本原理,并介绍了如何在 PyTorch 中实现 LSTM。

盼小辉丶的博客 1万+

STM32DMA功能详解

https://blog.youkuaiyun.com/weixin_37704787/article/details/125964616

m0_38012497的博客 151

信号完整性之串扰

1.前言 串扰(Crosstalk)是指信号线之间由互感、互容而引起的耦合,由于这种耦合的存在,当某一信号线发生电平翻转时,在附近的信号线上将感应到一定程度的噪声。 2. 电路设计中抑制串扰的方法 2.1 控制高速信号线之间的间距和平行走线的长度 多个高速信号长距离平行走线时,其间距应遵循3W原则,如下图所示: 3W原则指两相邻信号线的中心间距不少于信号线宽度的3倍,当满足3W原则时,信号线之间...

sinat_15677011的博客 1万+

16、STM32——DMA详解

1、DMA简介 DMA(Direct Memory Access) :直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候, CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者是 FLASH。 DMA 控制器包含了 DMA1 和 DMA2,其中 DMA1 有 7 个通道, DMA2 有 5 个通道,这里的通道可以理解为传输数据的一种管道。要注意的是 DMA2 只存在于大容量的单片机中

xiebs的博客 1万+

使用GBIF获取生物多样性数据与GIS的结合

随着全球生物多样性的重要性日益凸显,越来越多的研究人员和保护机构开始利用地理信息系统(GIS)来分析和可视化生物多样性数据。GBIF(全球生物多样性信息设施)作为一个全球性的生物多样性数据库,提供了大量的物种分布和分类信息,为研究人员和保护工作者提供了宝贵的数据资源。本文将介绍如何使用GBIF API获取生物多样性数据,并将其与GIS技术相结合,以便更好地理解和研究生物多样性。利用GIS的强大功能,我们可以在地理空间上可视化物种分布、分析物种多样性的空间格局,并为保护生物多样性提供科学依据。

BnxBackend的博客 1762

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Linux之DMA详解

Linux之DMA详解 1、什么是DMA? DMA全称Direct Memory Access(直接访问存储器)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据。 2、为什么需要DMA? 整个数据传输操作在一个称为DMA控制器的控制下进行,CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在外部设备和存储器进行数据传输的过程中,CPU可也进行其他的工作(前提是未设置停止CPU访问),这样,在大部分时间里,CPU和输入输出都处于并行操作,因此,计算机系统的效率将

wyttRain的博客 9980

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【STM32】DMA详解

00. 目录 文章目录00. 目录01. DMA简介02. DMA主要特性03. DMA框图04. DMA事务05. 通道选择06. 仲裁器07. DMA数据流08. DMA中断09. DMA寄存器9.1 DMA 低中断状态寄存器 (DMA_LISR)9.2 DMA 高中断状态寄存器 (DMA_HISR)9.3 DMA 低中断标志清零寄存器 (DMA_LIFCR)9.4 DMA 高中断标志清零寄存器 (DMA_HIFCR)9.5 DMA 数据流 x 配置寄存器 (DMA_SxCR) (x = 0

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 3168

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32 DMA详解

本文根据STM32F207用户手册DMA章节翻译总结的DMA知识点

人生一路,点滴记录 1万+

DTS中dma详解

通用DMA控制器和DMA请求绑定 DMA控制器的DTS 文件 必要参数: - #dma-cells: 必须至少为1。用于提供DMA控制器的特定信息。有关详细信息,请参阅下面的DMA客户机绑定。 可选参数: - dma-channels: 控制器支持的DMA信道数。 - dma-requests: 控制器支持的DMA请求信号数量。 例子: dma: dm...

龙图腾的博客 5245

STM32之DMA详解

DMA 是 MCU 内部预先设计的 “数据管道”,不占用内存空间,专门用于快速搬运数据,让 CPU 从繁琐的数据传输中解放。

m0_74186706的博客 972
上一篇: STM32 位带操作
下一篇: Cortex-M 内核的 OS 特性
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值