直接存储器存取(Direct Memory Access,DMA)详细讲解

发布者:leader5最新更新时间:2024-08-14 来源: cnblogs关键字:直接存储器存取  Direct  Memory  Access  DMA 手机看文章 扫描二维码
随时随地手机看文章

一、理论理解部分。

1、直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

2、无须CPU干预,数据可以通过DMA快速移动,这就节省了CPU的资源来做其他操作。

3、两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自一个或者多个外设对存储器访问的请求。

4、还有一个冲裁器协调各个DMA请求的优先权。在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中和低),优先权设置相等时由硬件决定(请求0优先请求1,)

5、每个通道都有三个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这三个事件标志逻辑或成为一个单独的中断请求。

6、闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。

7、可编程的数据传输数目:最大为65535

8、如果外设要想通过DMA 来传输数据,必须先给DMA 控制器发送DMA 请求,DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且DMA 控制器收到应答信号之后,就会启动DMA 的传输,直到传输完毕。DMA 有DMA1 和DMA2 两个控制器,DMA1 有7 个通道,DMA2有5 个通道,不同的DMA 控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置,具体见DMA 请求映像表。

 

 

 

 

9、

仲裁器当发生多个DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。仲裁器管理DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在DMA_CCRx 寄存器中设置,有4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的DMA通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道0 高于通道1。

 (为了解决多个DMA请求时,就有先后顺序,有一个仲裁器管理,分为两部分:1、软件处理,可以设置非常高、高、中、和低四个优先级,2、优先级一样,则看他们的编号,编号越低优先权越高)

 

 DMA数据配置的详细解说:

使用DMA,最核心就是配置要传输的数据,包括数据从哪里来,要到哪里去,传输的数据的单位
是什么,要传多少数据,是一次传输还是循环传输等等。
从哪里来到哪里去
我们知道DMA 传输数据的方向有三个:从外设到存储器,从存储器到外设,从存储器到存储器。
具体的方向DMA_CCR 位4 DIR 配置:0 表示从外设到存储器,1 表示从存储器到外设。

这里面涉及到的外设地址由DMA_CPAR 配置,存储器地址由DMA_CMAR 配置。

 

要传多少,单位是什么
当我们配置好数据要从哪里来到哪里去之后,我们还需要知道我们要传输的数据是多少,数据的
单位是什么。以串口向电脑发送数据为例,我们可以一次性给电脑发送很多数据,具体多少由
DMA_CNDTR 配置,这是一个32 位的寄存器,一次最多只能传输65535 个数据。要想数据传输正
确,源和目标地址存储的数据宽度还必须一致,串口数据寄存器是8 位的,所以我们定义的要发送的
数据也必须是8 位。外设的数据宽度由DMA_CCR 的PSIZE[1:0]配置,可以是8/16/32 位,存储器
的数据宽度由DMA_CCR 的MSIZE[1:0]配置, 可以是8/16/32 位。
在DMA 控制器的控制下,数据要想有条不紊的从一个地方搬到另外一个地方,还必须正确设置
两边数据指针的增量模式。外设的地址指针由DMA_CCRx 的PINC 配置,存储器的地址指针由
MINC 配置。以串口向电脑发送数据为例,要发送的数据很多,每发送完一个,那么存储器的地址指
针就应该加1,而串口数据寄存器只有一个,那么外设的地址指针就固定不变。具体的数据指针的增量
模式由实际情况决定。
什么时候传输完成
数据什么时候传输完成,我们可以通过查询标志位或者通过中断的方式来鉴别。每个DMA 通道
在DMA 传输过半、传输完成和传输错误时都会有相应的标志位,如果使能了该类型的中断后,则会
产生中断。有关各个标志位的详细描述请参考DMA 中断状态寄存器DMA_ISR 的详细描述。传输完
成还分两种模式,是一次传输还是循环传输,一次传输很好理解,即是传输一次之后就停止,要想再传
输的话,必须关断DMA 使能后再重新配置后才能继续传输。循环传输则是一次传输完成之后又恢复
第一次传输时的配置循环传输,不断的重复。具体的DMA_CCR 寄存器的CIRC 循环模式位控制。

 

 

二、编程要用的成员:

 

 

1、DMA_DIR : 传输方向选择, 可选外设到存储器、存储器到外设。它设定DMA_CCR 寄存器的DIR[1:0]位的值。这里并没有存储器到存储器的方向选择, 当使用存储器到存储器时,只需要把其中一个存储器当作外设使用即可。

(DMA_DIR_PeripheralDST:外设作为数据传输的目的地          DMA_DIR_PeripheralSRC:外设作为数据传输的来源)

2、DMA_PeripheralInc:

DMA_MemoryInc=         //内存地址寄存器递增与否
DMA_PeripheralInc=               //外设地址寄存器递增与否   

如果配置DMA_PeripheralInc_Enable,使能外设地址自动递增功能,它设定DMA_CCR 寄存器的PINC 位的值;一般外设都是只有一个数据寄存器,所以一般不会使能该位。(自动递增的意思就是:相当路边的自动出售饮料机器一样,当你买了一瓶汽水,拿出来了,然后后面有自动补上去,这就是自动递增,这里的数据也是一样,始终拿第一个数据,其他的会自动递增上来,不好意思,由于理解错误,现在做一下修改:是拿水瓶的手是)

3、DMA_BufferSize=          //设定待传输数目

4、DMA_M2M=          //使能DMA通道的内存到内存传输
5、DMA_MemoryBaseAddr=    //存储器地址
6、DMA_MemoryDataSize=      //内存数据宽度
7、DMA_PeripheralDataSize=  //外设数据宽度

8、DMA_Mode=          //工作模式,优先级
9、DMA_PeripheralBaseAddr=      //外设地址
10、DMA_Priority=          //软件设置通道的优先级


关键字:直接存储器存取  Direct  Memory  Access  DMA 引用地址:直接存储器存取(Direct Memory Access,DMA)详细讲解

上一篇:Systick时钟定时
下一篇:基于Systick系统时钟延时的LED闪烁灯

推荐阅读最新更新时间:2026-03-23 02:37

STM32学习笔记(九)DMA(Direct memory access controller)
直接存储器读取 DMA简介 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 DMA框图 由图可见,DMA 一共有 DMA1 和 DMA2 两个控制器。DMA1 有7个通道,DMA2 有5个通道。 在存储器和存储器之间传输数据时,可任选通道进行传输;但在外设和存储器之间传输数据时,需要用到专用的通道。 各个通道的 DMA1 请求 各个通道的 DMA2 请求 DMA寄存器 中断状态寄存器 --- ISR(interrupt status register):存放DMA中断的标志位; 注意:若为D
[单片机]
STM32-自学笔记(19.DMA——存储器直接存取,让数据传输更上一层楼)
概述:DMA(存储器直接存取) 一个完整的微控制器(处理器)通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,即一个组件能持续正常工作并不一定建立在另一个组件正常工作的前提上,而各个组件之间的协调与交互就由CPU来完成。如此一来,CPU作为整个芯片的“大脑”,其职能范围可谓广阔吗,如CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据……这样的数据搬运工作使得CPU的负荷显得相当繁重。 严格来说,搬运数据只是CPU众多职能中比较不重要的一种。CPU最重要的工作是进行数据的运算,从加减乘除四种基本运算到一些高级运算,包括浮点、积分、微分、FFT等运算。而在一些嵌入式的实时应
[单片机]
STM32-自学笔记(19.<font color='red'>DMA</font>——<font color='red'>存储器</font><font color='red'>直接</font><font color='red'>存取</font>,让数据传输更上一层楼)
DMA带中断的内存内存传输
  要使用中断配置 DMA,请按照内存到内存模式部分中详述的步骤进行操作。   在System Core 》 NVIC中启用DMA1 Channel 1 Global Interrupt如下图所示:   现在按以下键生成代码:Ctrl + S   4.1 HAL 库 DMA 与 IT 流程↑   DMA 初始化在main.c中生成。   HAL_DMA_Start_IT:开始DMA缓冲区传输   DMA1_Channel1_IRQHandler 在stm32f4xx_it.c中生成:它指示 DMA 过程是半/完成还是检测到错误。   HAL_DMA_IRQHandler定义在stm32f4xx_hal_dma.c:处理中断信
[单片机]
<font color='red'>DMA</font>带中断的<font color='red'>内存</font>到<font color='red'>内存</font>传输
STM32F103之DMA实验,内存通过DMA向串口1发送数据
#include dma.h ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// DMA_InitTypeDef DMA_InitStructure; u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度 //DMA1的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器- 外设模式
[单片机]
STM32使用DMA从串口读可变长度数据到内存
首先要解决DMA怎么知道要接收的数据何时开始,何时结束的问题。而且每次传输完数据,要改变下一次数据长度。 如果把DMA设成循环模式肯定是不行的,所以把DMA设置成正常模式。 STM32的串口有监测总线是否处于空闲的功能,我们可以使用这个功能,当数据传输完总线变成空闲状态时产生中断,来对收到的数据进行处理。因此整个过程就变成:当一堆数据开始传输,DMA默默地把数据搬运到内存中,当这堆数据传输完成,总线变成空闲状态时,马上产生中断,在中断服务程序中去做相应处理。 初始化程序: #define DMA_Rec_Len 10 //数据缓冲区大小 u8 value ; void uart_init_DMA_IN(u32
[单片机]
STM32 DMA->内存内存
基于STM32 F401 Discovery板: DMA2在AHB1总线上 步骤一:使能DMA #define DMA_STREAM_CLOCK RCC_AHB1Periph_DMA2 RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE); 步骤二:reset DMA Stream register: /* Reset DMA Stream registers (for debug purpose) */ DMA_DeInit(DMA_STREAM); 步骤三: /* Check if the DMA Stream is disab
[单片机]
STM32 <font color='red'>DMA</font>-><font color='red'>内存</font>到<font color='red'>内存</font>
Direct Insight推出i.MX8 SoM模块
系统集成商Direct Insight,日前推出了QS8M焊接模块,该模块由其长期合作伙伴基于亚琛的Ka-Ro 电子材料生产,集成NXP i.MX8M四核或双核Cortex-A53 64位处理器,以及RAM,闪存和电源管理。该模块采用QFN式引脚排列,可提供出色的小型化,热效率和EMI性能。 除了优化尺寸和成本外,该模块还通过多种方式提高装配效率,比如边缘周围的接触垫有助于检查,并易于布线,甚至允许使用两层基板。特殊的接地平面布局意味着模块在回流期间有效地“浮动”到位,这与BGA不同,后者位于凸块上并且可能需要X射线检查。此外,它们的尺寸仅为27×27mm,足够小,可以避免翘曲,而翘曲会对较大的板卡产生不利影响。 QS8M
[嵌入式]
实现低耗电D2D通讯应用 LTE Direct后势看涨
    LTE Direct技术将在装置对装置(Device to Device, D2D)通讯市场大显身手。LTE Direct可藉由LTE既有商用频段,实现装置对装置间远距、低耗电且高隐密性的资料传输,且未来将纳入3GPP R-12版本标准,因此发展潜力极佳,已迅速在市场上崭露锋芒。 LTE Direct技术将于装置对装置(Device to Device, D2D)市场大行其道。LTE Direct采用既有商用化长程演进计划(LTE)频段,可在不透过基地台中继的情况下,实现行动装置间的直接通讯,不仅让消费者可在短时间内连结大量装置,且耗电、距离、通讯安全表现均较Wi-Fi Direct更为理想,因而可望成为未来LTE手机的重要
[手机便携]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved