精华内容
下载资源
问答
  • DMA传送方式中,是DMA控制器发出DMA请求还是外部设备呢?
  • DMA传送

    2020-09-15 15:01:58
    目录DMA的由来两种由CPU控制传送方式程序传送方式无条件传送方式查询(有条件)传送方式中断传送方式CPU控制传送方式总结DMA原理DMA传送过程预处理数据传送后处理DAM传送的特点 DMA的由来 DMA全称是Direct ...

    DMA的由来

    • DMA全称是Direct Memory Access,即是直接存储器访问。 DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。
    • 在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式中断传送方式。CPU是通过系统总线与其他部件连接并进行数据传输。

    两种由CPU控制的传送方式

    程序传送方式

    • 程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式查询(有条件)传送方式两种。

    无条件传送方式

    • 微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。
    • 由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。

    查询(有条件)传送方式

    查询传送也称为条件传送,是指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态(如打印机、显示屏、摄像头等等),当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口电路中既要有数据端口,还要有状态端口。

    中断传送方式

    • 中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,CPU再继续执行被暂停的程序。

    CPU控制传送方式总结

    • 以上两种方式,均由CPU控制数据传输,不同的是程序传送方式由CPU来查询外设状态,CPU处于主动地位,而外设处于被动地位。这就是常说的----对外设的轮询,效率低。而中断传送法师则是外设主动向CPU发生请求,等候CPU处理,在没有发出请求时,CPU和外设都可以独立进行各自的工作。 需要进行断点和现场的保护和恢复,浪费了很多CPU的时间,适合少量数据的传送。

    DMA原理

    • DMA的出现就是为了解决批量数据的输入/输出问题。DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。这样数据的传送速度就取决于存储器和外设的工作速度。

    • 通常系统总线是由CPU管理的,在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。因此DMA控制器必须有以下功能:

      1. 能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
      2. 当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
      3. 能对存储器寻址即能修改地址指针,实现对内存的读写;
      4. 能决定本次DMA传送的字节数,判断DMA传送是否结束;
      5. 发出DMA结束信号,使CPU恢复正常工作状态。

      在这里插入图片描述

    • DMA传输将从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。 典型例子—移动一个外部内存的区块到芯片内部更快的内存区。

    • 对于实现DMA传输,它是由DMA控制器直接掌管总线(地址总线、数据总线和控制总线),因此,存在一个总线控制权转移问题

      • DMA传输开始前:CPU------>DMA控制器
      • DMA传输结束后:DMA控制器------>CPU
    • 一个完整的DMA传输过程必须经历DMA请求、DMA响应、DMA传输、DMA结束4个步骤。

    • DMA方式是一种完全由硬件进行组信息传送的控制方式,具有中断方式的优点,即在数据准备阶段,CPU与外设并行工作

    DMA的传送过程

    DMA的传送过程分为预处理数据传送后处理三个阶段

    预处理

    由CPU完成一些必要的准备工作

    • 首先, CPU执行几条I/O指令,用以测试I/O设备状态,向DMA控制器的有关寄存器置初值设置传送方向启动该设备等。
    • 然后,CPU继续执行原来的程序,直到I/O设备准备好发送的数据(输入情况)或接受的数据(输出情况)时,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求(统称为DMA请求),用以传输数据

    数据传送

    • DMA的数据传输可以以单字节(或字)为基本单位,对于以数据块为单位的传送(如硬盘),DMA占用总线后的数据输入和输出操作都是通过循环来实现。需要特别之处的是,这一循环也是由DMA控制器(而不是通过CPU执行程序)实现的,即数据传送阶段是完全由DMA(硬件)来控制的

    后处理

    • DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括检验送入主存的数据是否正确测试传送过程中是否出错(错误则转入诊断程序)决定是否继续使用DMA传送其他数据块等。

    DAM传送的特点

    • 外部设备的输入输出请求直接发给主储存器。
      • 主存储器既可以被CPU访问,也可以被外围设备访问。因此,在主存储器中通常要有一个存储管理部件来为各种访问主存储器的申请排队,一般计算机系统把外围设备的访问申请安排在最高优先级。
    • 不需要做保存现场和恢复现场等工作,从而使DMA方式的工作速度大大加快。
      • 由于在外围设备与主存储器之间传送数据不需要执行程序,因此,也不动用CPU中的数据寄存器和指令计数器等。
    • 在DMA控制器中,除了需要设置数据缓冲寄存器、设备状态寄存器或控制寄存器之外,还要设置主存储器地址寄存器设备地址寄存器数据交换个数计数器
      • 外围设备与主存储器之间的整个数据交换过程全部要在硬件控制下完成。另外,由于外围设备一般是以字节为单位传送的,而主存储器是以字为单位访问的,因此,在DMA控制器中还要有从字节装配成字和从字拆卸成字节的硬件。
    • 在DMA方式中,CPU不仅能够与外围设备并行工作,而且整个数据的传送过程不需要CPU的干预。如果主存储器的频带宽度足够的话,外围设备的工作可以丝毫不影响CPU运行它自身的程序。
    展开全文
  • 嵌入式_DMA传送

    2020-06-19 16:30:01
    DMA传送 一、控制方式 主机与外设之间数据传送的控制方式有以下四种: • 无条件传送 • 查询式传送 • 中断方式传送 • 直接存储器存取(DMA, Direct Memory Access) (一)、无条件传送方式 适用于总是处于准备好...

    DMA传送

    一、控制方式

    主机与外设之间数据传送的控制方式有以下四种:
    • 无条件传送
    • 查询式传送
    • 中断方式传送
    • 直接存储器存取(DMA, Direct Memory Access)

    (一)、无条件传送方式

    适用于总是处于准备好状态的外设
    • 直接对IO口寄存器进行读写(如GPIO读写)
    • 以下外设可采用无条件传送方式:
    • 开关
    • 发光器件(如发光二极管、7段数码管、灯泡等)
    • 继电器
    • 步进电机
    • 优点:软件及接口硬件简单
    • 缺点:只适用于简单外设,适应范围较窄

    (二)、查询方式传送

    • 适用于外设并不总是准备好,而且对传送速率、传送效率要求不高的场合。
    • CPU在与外设交换数据前必须询问外设状态——“你准备好没有?”
    • 对外设的要求:应提供设备状态信息
    • 对接口的要求:需要提供状态端口
    • 优点:软件比较简单
    • 缺点:CPU效率低,数据传送的实时性差,速度较慢

    (三)、中断方式传送

    CPU无需循环查询外设状态,而是外部设备在需要进行数据传送时才中断CPU正在进行的工作,让CPU来为其服务。即CPU在没有外设请求时可以去做更重要的事情,有请求时才去传输数据,从而大大提高了CPU的利用率。
    • 优点:CPU效率高,实时性好,速度快。
    • 缺点:程序编制较为复杂,如果需要进行大量数据传输,频繁响应中断,由于每次都需要保存现场,导致CPU执行效率底下。

    二、传输原理

    1. DMA设置 ⑦
      CPU通过写入控制器的
      相应寄存器设置源、目
      标地址及传输数等信息。
    2. DMA传输
      ① 外设发出DMA请求
      ② DMAC向CPU申请总线
      ③ CPU完成当前总线周期后响应,并释放总线控制权
      ④ DMAC得到总线控制权,并发出DMA响应信号
      ⑤ 由DMAC发出各种控制信号,控制外设与存储器之间的数据传送
      ⑥ 数据传送完后,DMAC撤销HOLD信号
      ⑦ CPU释放HLDA信号,并重新控制总线

    三、DMA控制器

    使用DMA方式传输时,需要一个专门的器件来协调外设接口和内存储器的数据传输,该器件称为DMA控制器。一个DMAC可以有多个通道连接到不同外设。
    DMAC内部的主要寄存器:
    • 地址寄存器:存放DMA传输时存储单元地址和外设数据寄存器地址;
    • 字节计数器:存放DMA传输的字节数;
    • 控制寄存器:存放由CPU设定的DMA传输方式,控制命令等;
    • 状态寄存器:存放DMAC当前的状态,包括有无DMA请求,是否结束等。
    • DMAC在系统中的二种不同角色:
    • 总线从模块:
    CPU对DMAC进行预置操作,也就是向DMAC写入内存传送区的首地址、传送字节数和控制字时,DMAC相当于一个外设接口,称为总线从模块。
    • 总线主模块:
    进行DMA传输时,CPU暂停对系统总线的控制,DMAC取得了对总线的控制权,这时的DMAC称为总线主模块。
    DMA控制器的工作过程
    ① 当外设准备好,可以进行DMA传送时,外设向DMA控制器发出“DMA传送请求”信号(DRQ);
    ② DMA控制器收到请求后,向CPU发出“总线请求”信号HOLD,表示希望占用线;
    ③ CPU在完成当前总线周期后会立即对HOLD信号进行响应。响应包括两个动作:一是CPU将数据总线、地址总线和相应的控制信号线均置为高阻态,由此放弃对总线的控制权。另一方面,CPU向DMA控制器发出“总线响应”信号(HLDA)。
    ④ DMA控制器收到HLDA信号后,就开始控制总线,并向外设发出DMA响应信号DACK;
    ⑤ DMA控制器送出地址信号和相应的控制信号,实现外设与内存或内存与内存之间的直接数据传送;例如,向I/O接口发出读信号,同时往地址总线上发出存储器的地址和存储器写信号和AEN信号,即可从外设向内存传送一个字节。
    ⑥ DMA控制器自动修改地址和字节计数器,并判断是否需要重复传送操作。
    ⑦ 结束:当规定的数据传送完后,DMA控制器就撤销发往CPU的HOLD信号。CPU检测到HOLD失效后,紧接着撤销HLDA信号,并在下一时钟周期重新开始控制总线。

    四、传输方式

    • DMA的三种传输方式:
    • 连续传送(块传送)
    • DMAC申请到总线后,将一块数据传送完后才释放总线,而不管中间DREQ是否有效。
    • 单次传送(每次传送一个字节)
    • 每个DMA周期只传送一个字节就立即释放总线。
    • 按需传送(猝发传送)
    • 只要I/O接口的数据缓冲可用(非空或未满),就进行传送。
    (注:I/O接口需要有一定大小的FIFO缓冲)

    在这里插入图片描述

    五、DMA与主存交换数据的方法

    • 当CPU需要访问DMA的外设时:当前外设访问不可,其他外设访问可能(如通过总线矩阵)
    • 当CPU与DMA同时访问内存时有3种处理方式:
    1、停止CPU访问主存
    2、周期挪用(周期窃取,DMA窃取CPU总线周期)
    3、DMA与CPU交替访问

    1、停止CPU访问主存
    • 当外围设备要求传送一批数据时,由DMA控制器发一个停止信号给CPU,要求CPU放弃对地址总线、数据总线和有关控制总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传送。在一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。在这种DMA传送过程 中,CPU基本处于不工作状态或者说保持状态。
    • 优点:控制简单,它适用于数据传输率很高的设备进行成组传送。
    • 缺点:在DMA控制器访内阶段,内存的效能没有充分发挥,相当一部分内存工作周
    期是空闲的。这是因为,外围设备传送两个数据之间的间隔一般总是大于内存存储周
    期,即使高速I/O设备也是如此。

    2、周期挪用(周期窃取)
    • 当I/O设备没有DMA请求时,CPU按程序要求访问内存;一旦I/O设备有DMA请求,则由I/O设备挪用一个或几个内存周期。
    • I/O设备请求DMA传送有三种情况:

    1. CPU此时不需要访问主存(I/O设备与CPU无冲突)
    2. CPU此时正在访问主存(必须等待存取周期结束,CPU才能将总线控制权让出)
    3. I/O设备与CPU都要求访问主存(在CPU执行访问主存指令的过程中插入DMA请求,并挪用了一二个内存周期)

    • 优点:既实现了I/O传送,又较好地发挥了内存和CPU的效率,是一种广泛采用的方法。
    • 缺点:I/O设备每一次周期挪用都有申请总线控制权、建立总线控制权和归还总线控制权的过程,所以传送一个字对内存来说要占用一个周期,但对DMA控制器来说一般要2—5个 内存周期(视逻辑线路的延迟而定)。因此,周期挪用的方法适用于I/O设备读写周期大于内存存储周期的情况。

    3、DMA与CPU交替访问
    • DMA与CPU相互配合,交替执行,时分复用。这种DMA传送对CPU来说,如同透
    明的玻璃一般,没有任何感觉或影响。在透明的DMA方式下工作,CPU既不停止
    主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件
    逻辑也就更加复杂。
    • 优点:不需要总线使用权的申请、建立和归还过程,总线使用权是通过DMA访存
    和CPU访存分时进行的。CPU既不停止主程序的运行,也不进入等待状态,是一种
    高效率的工作方式
    • 缺点:相应的硬件逻辑更加复杂。

    展开全文
  • DMA传送的C语言实现

    2009-05-25 11:27:30
    计算机采用直接存储器存取DMA传送数据时,是在设备之间直接开辟高速的数据通道,不需要CPU介入,而是由DMA控制器直接控制。因此,编程合理与否,直接影响计算机的运行效率和正确性,这里以实验为例,利用C语言给出DMA控制器...
  • 为实现单片机控制系统中高速数据的传送,应用接口扩展电路和DMA控制器,通过存储器扩展,在几乎不占用单片机资源的情况下,实现了单片机控制系统的DMA数据传送。该方法可用于软盘驱动器或高速采样的接口设计。
  • 一个DMA控制器,实际上是采用DMA方式的外围设备与系统总线之间的接口...在DMA传送时,每传送一个字,字计数器就加“1” ,当计数器溢出即最高位产生进位时,表示这批数据传送完毕,于是引起DMA控制器向CPU发中断信号。
  • DMA技术与DMA控制

    2011-11-25 22:35:04
    DMA方式不用处理器干预完成M与I/O间数据传送DMA期间系统总线由其它主模块控制(驱动) 控制总线的主模块要提供系统的地址及控制信号。 DMA控制器与处理器配合可实现系统的DMA功能
  • DMA基础 ...DMAC具有独立的控制三大总线(数据总线、地址总线、控制总线)来访问存储器和I/O端口的能力,它能像CPU一样提供数据传送所需的地址信息和读写控制信息。DMAC和CPU都挂在系统总线上,当进入DM

    DMA基础

    直接存储访问(Direct Memory Access,DMA),允许不同速度的硬件装置之间的通信,不依赖于CPU。下面两张图形象地描述了DMA方式与非DMA方式的区别:



    DMAC具有独立的控制三大总线(数据总线、地址总线、控制总线)来访问存储器和I/O端口的能力,它能像CPU一样提供数据传送所需的地址信息和读写控制信息。DMAC和CPU都挂在系统总线上,当进入DMA方式时,DMAC成为总线主控。在总线上,可以控制其他部件的部件成为总线主控或主控(bus master),被控制部件称为从控(slave)。任意时刻,总线上只有一个主控。DMA操作之前,应先对DMAC编程,把要传送的数据块长度、数据块在存储器中的起始地址,数据传送方向等信息发送给DMAC。

    CC2530的DMA

    CC2530中的DMA控制器协调所有的DMA传送,确保DMA请求和CPU存储器访问之间按照优先级协调、合理地进行。DMA控制器含有若干可编程的DMA通道,用来实现存储器-存储器的数据传送。DMA控制器控制整个XDATA存储空间的数据传送,由于大多数SFR寄存器(特殊寄存器)映射到DMA存储器空间,这些灵活的DMA通道的操作能够以创新的方式减轻CPU的负担,而在CC2530的数据手册中2.2.3物理存储器这节描述了哪个SFR寄存器映射到XDATA存储空间。

    DMA控制器的主要功能如下

    • 5个独立的DMA通道
    • 3个可以配置的DMA通道优先级
    • 32个可以配置的传送触发事件
    • 源地址和目标地址的独立控制
    • 单独传送、数据块传送和重复传送模式
    • 支持传输数据的长度域,设置可变传输长度
    • 即可以工作在子模式,又可以工作在字节模式

    DMA操作

    DMA控制器有5个通道,即DMA通道0到通道4。每个DMA通道都能够从DMA存储器空间的一个位置传送数据到另一个位置,比如XDATA位置之间。为了使用DMA通道,必须先DMA配置参数和DMA配置安装,DMA状态图如下:

    当DMA通道配置完毕后,在允许任何传输发起之前,必须进入工作状态。DMA通道通过将DMA通道工作状态寄存器DMAARM中指定位置1,就可以进入工作状态一旦DMA通道进入工作状态,当配置的DMA触发事件发生时,传送就开始了。注意一个通道准备工作(即获得配置数据)的时间需要9个系统时钟,因此如果相应的DMAARM位设置,触发在需要配置通道的时间内出现,期望的触发将丢失。如果多于一个DMA通道同时进入工作状态,所有通道配置的时间将长一些(按顺序读取内存)。如果所有5个通道都进入工作状态,需要45个系统时钟,通道1首先准备好,然后是通道2,最后是通道0(所有都在最后8个系统时钟内)。可能的DMA触发事件有32个,如下表所示,例如UART传输、定时器溢出等。DMA通道要使用的触发事件有DMA通道配置设置,因此直到配置被读取之后,才能知道。使用这个触发器源必须符合端口中断使能位PICTL.P0IENL/H和P1IEN,注意所有中断使能的端口引脚都将产生一个触发。


    为了通过DMA触发事件开始DMA传送,用户软件可以设置对应的DMAREQ位,强制使一个DMA传送开始。应该注意如果之前配置的触发器源在DMA正在配置的时候产生了触发事件,就被当着错过的事件,一旦DMA通道准备好,传送就立即开始。即使新的触发和之前的触发不同也是这样。在一些情况下,这会导致传输错误,为了纠正这一点,触发源0必须是重新配置之间的触发源。这通过设置虚拟源和目标地址、使用一个字节的固定长度、块传输和触发源0实现。使能软件触发器(DMAREQ)清除错过的触发数,从存储器中取出一个新的配置之前(除非软件为该通道写DMAREQ),不产生新的触发。DMAREQ位只能在相应的DMA传输发生时清除,当通道解除准备工作状态时,DMAREQ位不被清除。

    DMA配置参数

    DMA运行的安装和控制由用户软件完成,本节描述了DMA通道能够使用之前,必须配置的参数。
    这5个DMA通道每一个的行为通过下列参数配置:
    源地址
    DMA通道要读的数据的首地址
    目标地址
    DMA通道从源地址读出的要写数据的首地址。用户必须确定该目标地址为可写
    传送长度
    在DMA通过重新进入工作状态或解除工作状态之前,以及警告CPU即将有中断请求到来之前,要传送的长度。长度可以在配置中定义,或可以如下所述定义为VLEN设置。
    可变长度(VLEN)设置
    DMA通道可以利用源数据中的第一个字节或字作为传送长度进行可变长度传输。使用可变长度传输时,要给出关于如何计算要传输的字节数的各种选项。
    优先级
    DMA通道的DMA传送的优先级与CPU、其他DMA通道和访问端口有关
    触发事件
    所有DMA传输通过所谓的DMA触发事件来发起。这个触发可以启动一个DMA块传输或单个DMA传输。除了已经配置的触发,DMA通道总是可以通过设置它的指定DMAREQ.DMAREQx标志来触发,DMA触发的源描述在上表8-1中。
    源地址和目标地址增量
    源地址和目标地址可以空位增量或减少,或不改变
    传送模式
    传送模式确定传送是否是单个传输、或块传输、或是它们的重复传输
    中断屏蔽
    在完成DMA通道传送是,产生一个中断请求。这个中断屏蔽位控制中断产生是使能还是禁用
    M8
    这个域的值,决定是否采用7位还是8位长的字节来传送数据,此模式仅仅适用于字节传送。

    DMA配置安装

    以上描述的DMA通道参数(诸如地址模式、传送模式和优先级等)必须在DMA通道进入工作状态之前并激活。参数不直接通过SFR寄存器配置,而是通过写入存储器中特殊的DMA配置数据结构中配置,即CC2530中不能用设置寄存器的方式配置DMA参数,而要使用一种特殊的DMA配置结构体,DMA Configure Data Structure结构体,IAR编译环境中位域字段默认采用小端模式,配置结构体声明前使用#pragma bitfields = reversed取反向,声明结束后恢复IAR默认方式。对于使用的每个DMA通道,需要有它自己的DMA配置数据结构。DMA配置数据结构包含8个字节,对于每个DMA通道,DMA数据结构由8个字节组成。配置数据结构描述如下表所示:

    /********************************************************
     * IAR编译环境中位域字段默认取向采用小端模式,
     * 配置结构体声明前使用#pragma bitfields=reversed取反向,
     * 声明结束后恢复IAR默认方式
     ********************************************************/
    #pragma bitfields = reversed
    typedef struct {
      uint8 SRCADDRH;       //源地址高字节
      uint8 SRCADDRL;       //源地址低字节
      uint8 DESTADDH;       //目的地址高字节
      uint8 DESTADDL;       //目的地址低字节
      uint8 VLEN:3;         //变成传输模式
      uint8 LENH:5;         //传输长度高字节
      uint8 LENL:8;         //传输长度低字节
      uint8 WORDSIZE:1;     //字节传输或字传输
      uint8 TMODE:2;        //传输模式
      uint8 TRIG:5;         //触发时间选择
      uint8 SRCINC:2;       //源地址增量方式选择
      uint8 DESTINC:2;      //目的地址增量方式选择
      uint8 IRQMASK:1;      //中断屏蔽位
      uint8 M8:1;           //字节传输模式时用,8或7bit传输,仅仅适合在字节传输模式下
      uint8 PRIORITY:2;     //优先级选择
    }DMA_DESC;
    #pragma bitfields = default


    DMA配置数据结构可以存放在由用户软件设定的任何位置,而地址通过一组SFR,DMAxCFGH:DMAxCFGL送到DMA控制器。一旦DMA通道进入工作状态,DMA控制器就会读取该通道的配置数据结构,由DMAxCFGH:DMAxCFGL地址给出。需要注意的是,指定DMA配置数据结构开始地址的方法十分重要,这些地址对于DMA通道0和DMA通道1~4是不同的:
    DMA0CFGH:DMA0CFGL给出DMA通道0配置数据结构的开始地址
    DMA1CFGH:DMA1CFGL给出DMA通道1配置数据结构的开始地址,其后跟着通道2-4的配置数据结构
    因此DMA控制器希望DMA通道1-4的DMA配置数据结构存在于存储器 连续的区域内,以DMA1CFGH:DMA1CFGL所保存的地址开始,包含32个字节。

    停止DMA传输

    使用DMAARM寄存器来解除DMA通道工作状态,停止正在运行的DMA传送或进入工作状态的DMA。将1写入DMAARM.ABORT寄存器位,就会停止一个或多个进入工作状态的DMA通道,同时通过设置相应的DMAARM.DMAARMx为1选择停止哪个DMA通道。当设置DMAARM.ABORT为1,非停止通道的DMAARM.DMAARMx位必须写入0。

    DMA中断

    每个DMA通道可以配置为一旦完成DMA传送,就产生中断到CPU。该功能由IRQMASK位在通道配置时实现。当中断产生时,SFR寄存器DMAIRQ中所对应的中断标志位置1。一旦DMA通道完成传送,不管在通道配置中IRQMASK位是何值,中断标志都会置1.这样,当通道重新进入工作状态且IRQMASK的设置改变时,软件必须总是检测(并清除)这个寄存器。如果这样做失败,将会根据存储的中断标志产生一个中断。

    DMA寄存器





    有关CC2530的GPIO基本知识、普通GPIO操作有关寄存器的介绍、IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作——点亮led灯)
    程序

    /******************************************
     * 基础实验只需要添加以下头文件
     ******************************************/
    #include <ioCC2530.h>
    
    #define uint8 unsigned char   //或typedef unsigned char uint;
    #define uint16 unsigned int 
    
    /********************************************************
     * IAR编译环境中位域字段默认取向采用小端模式,
     * 配置结构体声明前使用#pragma bitfields=reversed取反向,
     * 声明结束后恢复IAR默认方式
     ********************************************************/
    #pragma bitfields=reversed
    typedef struct {
      uint8 SRCADDRH;       //源地址高字节
      uint8 SRCADDRL;       //源地址低字节
      uint8 DESTADDRH;       //目的地址高字节
      uint8 DESTADDRL;       //目的地址低字节
      uint8 VLEN:3;         //变长传输模式
      uint8 LENH:5;         //传输长度高字节
      uint8 LENL:8;         //传输长度低字节
      uint8 WORDSIZE:1;     //字节传输或字传输
      uint8 TMODE:2;        //传输模式
      uint8 TRIG:5;         //触发时间选择
      uint8 SRCINC:2;       //源地址增量方式选择
      uint8 DESTINC:2;      //目的地址增量方式选择
      uint8 IRQMASK:1;      //中断屏蔽位
      uint8 M8:1;           //字节传输模式时用,8或7bit传输,仅仅适合在字节传输模式下
      uint8 PRIORITY:2;     //优先级选择
    }DMA_DESC;
    #pragma bitfields=default
    
    #define DATA_AMOUNT 32
    
    /*****************************************************
     * CC2530数据手册中对DMA数据结构的介绍,对以下常量赋值
     ****************************************************/
    #define DMA_VLEN_USE_LEN  0x00 // Use LEN for transfer count
    
    #define DMA_WORDSIZE_BYTE 0x00 // Transfer a byte at a time
    #define DMA_WORDSIZE_WORD 0x01 // Transfer a 16-bit word at a time
    
    #define DMA_TMODE_SINGLE             0x00 // Transfer a single byte/word after each DMA trigger           单个传输模式
    #define DMA_TMODE_BLOCK              0x01 // Transfer block of data (length len) after each DMA trigger   块传输模式
    #define DMA_TMODE_SINGLE_REPEATED    0x02 // Transfer single byte/word (after len transfers, rearm DMA)   重复单个传输模式
    #define DMA_TMODE_BLOCK_REPEATED     0x03 // Transfer block of data (after len transfers, rearm DMA)      重复块传输模式
    
    #define DMA_TRIG_NONE                0    // No trigger, setting DMAREQ.DMAREQx bit starts transfer       无触发
    #define DMA_SRCINC_0                 0x00 // Increment source pointer by 0 bytes/words after each transfer源地址递增0字节/字
    #define DMA_SRCINC_1                 0x01 // Increment source pointer by 1 bytes/words after each transfer源地址递增1字节/字
    #define DMA_DESTINC_1                0x01 // Increment destination pointer by 1 bytes/words after each transfer目标地址递增1字节/字
    
    #define DMA_IRQMASK_DISABLE          0x00 // Disable interrupt generation                                 通道的中断屏蔽
    #define DMA_IRQMASK_ENABLE           0x01 // Enable interrupt generation upon DMA channel done            通道的中断使能
    
    #define DMA_M8_USE_8_BITS            0x00 // Use all 8 bits for transfer count                            采用所有8位作为传输长度
    #define DMA_M8_USE_7_BITS            0x01 // Use 7 LSB for transfer count                                 采用字节地7位作为传输长度
    
    #define DMA_PRI_LOW                  0x00 // Low, CPU has priority                                        低优先级,CPU优先
    #define DMA_PRI_GUARANTEED           0x01 // Guaranteed, DMA at least every second try                    保证级,DMA至少在每秒一次的尝试中优先
    #define DMA_PRI_HIGH                 0x02 // High, DMA has priority                                       高优先级,DMA优先
    #define DMA_PRI_ABSOLUTE             0x03 // Highest, DMA has priority. Reserved for DMA port access.     
    
    #define DMAARM_DMAARM0               0x01
    #define DMAREQ_DMAREQ0               0x01  
    #define DMAIRQ_DMAIF0                0x01
    
    #define NOP()  asm("NOP")
    
    //DMA配置参数
    static DMA_DESC dmaConfig0;
    //此数据是用来复制到内存的其他区域
    static char data[DATA_AMOUNT] = "DMA man trigger!";
    //用来保存复制来的数据区域
    static char copy[DATA_AMOUNT];
    //数据长度
    
    void UartInit(void)
    {
      PERCFG = 0x00;
      P0SEL  = 0x0c;
      P2DIR &= ~0xc0;
      
      U0CSR |= 0x80;
      
      U0GCR |= 11;
      U0BAUD |= 216;
      UTX0IF = 0;
    }
    
    void UartSendString(char *Data, uint16 len)
    {
      uint16 j;
      for (j = 0; j < len; j++)
      {
        U0DBUF = *Data++;
        for (; 0 == UTX0IF;);
        UTX0IF = 0;
      }
    }
    
    void Delay_ms(uint16 ms)
    {
      uint16 i,j;
      for(i = 0; i < ms; i++)
      {
        for(j = 0;j < 1774; j++);
      }
    }
    
    void main()
    {
      CLKCONCMD &= ~0x40;
      for(; CLKCONSTA & 0x40;);
      CLKCONCMD &= ~0X47;
      
      UartInit();
      UartSendString(data,sizeof(data));
      
      dmaConfig0.SRCADDRH   = ((uint16)&data >> 8) & 0x00FF;    //获取到data地址(源地址)的高8位地址
      dmaConfig0.SRCADDRL   = ((uint16)&data) & 0x00FF;         //获取到data地址(源地址)的低8位地址
      dmaConfig0.DESTADDRH = ((uint16)&copy >> 8) & 0x00FF;     //获取到copy地址(目的地址)的高8位地址
      dmaConfig0.DESTADDRL = ((uint16)&copy) & 0x00FF;          //获取到copy地址(目的地址)的低8位地址
      
      dmaConfig0.VLEN      = DMA_VLEN_USE_LEN;                 //设置可变长度为0
      dmaConfig0.LENH      = (DATA_AMOUNT >> 8) & 0x00FF;      //获取传输长度的高5位
      dmaConfig0.LENL      = (DATA_AMOUNT) & 0x00FF;           //获取传输长度的低8位
      
      dmaConfig0.WORDSIZE  = DMA_WORDSIZE_BYTE;                //设置为字节传输模式,赋值0
      dmaConfig0.TMODE     = DMA_TMODE_BLOCK;                  //块传输模式
      dmaConfig0.TRIG      = DMA_TRIG_NONE;                    //无触发模式,即无触发源
      
      dmaConfig0.SRCINC    = DMA_SRCINC_1;                     //源地址1个字节/字递增
      dmaConfig0.DESTINC   = DMA_DESTINC_1;                    //目的地址1个字节/字递增
      
      dmaConfig0.IRQMASK   = DMA_IRQMASK_DISABLE;              //通道的中断屏蔽
      dmaConfig0.M8        = DMA_M8_USE_8_BITS;                //采用所有8位作为传输长度
      dmaConfig0.PRIORITY  = DMA_PRI_HIGH;                     //高优先级,DMA优先
      
      DMA0CFGH = ((uint16)&dmaConfig0 >> 8) & 0x00FF;        //DMA通道0配置地址高8位地址
      DMA0CFGL = ((uint16)&dmaConfig0) & 0x00FF;             //DMA通道0配置地址低8位地址
      
      /*DMA进入工作模式通道0*/
      DMAARM |= DMAARM_DMAARM0;//为了任何DMA传输能够在该通道上发生,该位必须置1,对于非重复传输模式,一旦完成传送,该位自动清0
      /*一个通道准备工作(即获得配置数据)的时间需要9个系统时钟*/
      NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP(); // 9 NOPs
      
      /*DMA通道0传送请求,即触发DMA传送*/
      DMAREQ |= DMAREQ_DMAREQ0;//设置为1,激活DMA通道0(与一个触发事件具有相同的效果),当DMA传输开始清除该位
      
      /*等待DMA通道0传送完毕*/
      for (; !(DMAIRQ & DMAIRQ_DMAIF0););//当DMA通道0传送完成,DMAIRQ:DMAIF0位置1,与上DMAIRQ_DMAIF0(0x01),取非后为0退出循环
      
      /*清除中断标志*/
      DMAIRQ = ~DMAIRQ_DMAIF0;
      
      Delay_ms(5);
      UartSendString("DMA transfer after copy-->",sizeof("DMA transfer after copy-->"));
      Delay_ms(5);
      UartSendString(copy,sizeof(copy));
     
      for (;;);
    }
    
    注意:每创建一个新工程都要配置IAR(做基础实验),TI CC2530基础实验(普通GPIO操作——点亮led灯)也有IAR相关配置步骤


    在DMA通道0配置DMA参数地址时,当时代码如下:

    所有,DMA通道配置DMA参数地址一定不能错。还有以上串口打印之间需要一点延时时间,否则会出错。

    总结
    1、创建一个DMA数据结构体
    2、初始化DMA数据结构体
    3、DMA通道n配置地址,将DMA数据结构体地址赋值给DMAnCFGH和DMAnCFGL寄存器
    4、配置好DMA参数后,开启DMA通道n进入工作模式,不要忘了一个通道准备工作需要9个系统时钟
    5、DMA通道n请求传送,即触发传送
    6、等待DMA通道n传送完毕,完成后硬件将其对应为置1
    7、清除传送完毕,将对应位置0


    展开全文
  • DMA数据传送流程

    千次阅读 2010-09-03 14:10:00
    首先:对DMA控制器编程,写入数据要到达的内存地址和药传送的字节数; 其次:适配器开始传送数据,它将激活DREQ线,与DMA控制器联通; 然后:DMA控制器与CPU去的总线控制权后,输出内存地址,发送...

    首先:对DMA控制器编程,写入数据要到达的内存地址和药传送的字节数;

    其次:适配器开始传送数据,它将激活DREQ线,与DMA控制器联通;

    然后:DMA控制器与CPU去的总线控制权后,输出内存地址,发送控制信号,使得一个字节或一个字从适配器读出并写入相应的内存中;

    最后,更新内存地址,指向下一个字节要写入的地址,重复上面的操作,直至数据传送完毕。

    对控制器进行不同的编程,可以实现单字节传送(每传送一个字节都要求一个DREQ信号)或者块数据传送(全部数据传送只需要一个DREQ信号)

    展开全文
  • DMA控制方式

    千次阅读 2019-05-01 16:11:40
    通常系统总线是由CPU管理的,在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。因此DMA...
  • 8237dma的四种传送方式简介

    千次阅读 2018-01-05 11:07:23
     单字节传送方式是每次DMA传送时,仅传送一个字节。传送一个字节之后,当前字节计数器减1,地址寄存器加1或减1,HRQ变为无效,释放总线控制权,将控制权交还给CPU。如果传送使得字节计数器减为0或由外设产生信号时...
  • DMA控制器 8237A的特点 8237A的内部结构 8237A的寄存器 8237A的软件命令 8237A的工作时序 8237A的初始化 8237A在PC机中的应用
  • DMA控制器 intel237

    2019-02-24 16:05:43
    1.外设向DMAC发出DMA传送请求。 2. DMAC向CPU发出HOLD信号(DMA请求)。 3. CPU在完成当前总线操作后会立即对DMA请求作出响应:一,CPU放弃总线控制权,将控制、数据、地址总线悬空;二,CPU将有效的HLD...
  • 基本的DMA控制

    2018-08-10 17:30:09
    转:基本的DMA控制器 8.3.1 DMA的基本概念  直接内存访问(DMA)是一种完全由硬件执行I/O...DMA控制器将向内存发出地址和控制信号,修改地址,对传送的字的个数计数,并且以中断方式向CPU报告传送操作的结束。...
  • DMA控制器8237A

    千次阅读 2020-11-20 15:03:43
    DMA(direct memory access)是一种外设与存储器或者存储器与存储器之间直接传输数据的方式,在进行DMA存取时,CPU让出总线控制权,不在采用输入输出指令的方法进行数据存取,而采用一个专门的硬件DMAC(Direct Memory ...
  • 8237A DMA控制器简答

    千次阅读 2019-11-30 19:04:55
    (1)、比较中断和DMA两种传输方式的特点。 在中断模式下,外设需与主机传送数据时要请求主机给与...当外设与存储器之间需要传送数据时,外设向DMA控制器发出DMA请求,DMA控制器向CPU发出总线请求,取得总线控制权后...
  • 本文讲述以包含单个AHB master接口的DMA控制器为基础的SoC系统架构蓝本,分析存在的不足之处,并引入一种以新型DMA控制器为基础的SoC系统架构的设计,解决提出的问题。  1 对异步事件响应速度  系统实时性是指能...
  • STM32-(34):DMA传输控制(理论)

    千次阅读 2019-06-13 21:44:30
    一次DMA传送只需要执行一个DMA周期(相当于一个总线读/写周期),因而能够满足高速外设数据传输的需要。 Direct Memory Access (存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接...
  • STM32网络之DMA控制

    2021-04-06 14:42:11
    STM32网络控制器框图如下: 前面的文章我们已经讲解了: ①External PHY Intereface:《STM32网络电路设计》 ②MAC控制器:《STM32MAC控制器》 ...控制器(也就是DMA)利用描述符有效的将数据从源地址移动到目的
  • DMA控制器的学习

    2012-05-22 12:49:56
    1.含义 DMA控制器 即 direct memory access直接内存访问控制器,可以独立于CPU,直接对内存数据进行访问,达到内存数据和外围设备的数据传送传送速度较快。 2.DMA控制器工作时和CPU之间的关系  ①DMA工作时,...
  • DMA传送 用DMA方式传送数据时,传送过程完全由DMA控制器(DMAC)控制。其基本功能: DMAC能向CPU的HOLD脚发出DMA请求信号。 CPU响应DMA请求后,DMAC获得总线控制权,由它控制数据的传送,CPU则暂停工作。 能提供读/...
  • 1、前言 单片机以其高可靠性,高性能价格比,在工业控制系统、数据采集系统、智能化仪器仪表、办公... 2、DMA简介 DMA数据传送是由DMA控制器完成的。进行数据传输时,DMA控制器从CPU完全接管对总线的控制,数据交换
  • DMA控制器的编程结构及编程,你可以通过该文档学习如何使用DMA方式进行内核文件的传送,是你进行内核驱动开发必须了解的内容。
  • DMA控制器硬件结构

    千次阅读 2012-12-01 22:36:48
    DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 ...
  • 1、掌握8237A可编程DMA控制器和微机的接口方法。 2、学习使用8237A可编程控制器,实现数据直接快速传送的编程方法。 *使用8237A可编程DMA控制器实验内容

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 554
精华内容 221
关键字:

dma传送控制