DSP开发知识 > 文章列表
教你学DSP28335 第十二讲 DMA 模块 (浏览次数:7)
发表于2022/1/23 11:54:00
一、DMA模块概述

数字信号控制器的优势不能纯粹以处理器的速度来衡量,而是以整个系统的能力来衡量。数字信号控制器处理的许多应用操作都要用大量的带宽来移动数据,如从片外存储器到片内存储器,从一个外设(例如一个模数转换器)到RAM,从一个外设到另一个外设之间。例如当控制器读写AD采集的数据时或者读写外部扩展存储器内容时,内存与外设间会存在着大量的数据交换,而且这种交换是经常性的。对于这样的数据交换,若采用中断方式响应,每传送一次数据,就要经历中断处理的全部步骤,CPU就会不断的进行中断的相关操作,如将工作现场寄存器压入堆栈,中断结束时,恢复现场,CPU频繁的进行工作现场的切换,非常不专注,效率非常低。有没有一种专用通道,专用的控制器来负责这类经常性的操作,而将CPU资源释放出来呢?  
直接存储访问DMA(Direct Memory Access)模块就是用硬件实现存储器与存储器之间、存储器与I/O设备之间直接进行高速数据传送,不需要CPU的干预,减少了中间环节,而且存储器地址的修改和传送均由硬件自动完成,所以极大地提高了批量数据的传送速度。
    实现DMA传送的关键部件是DMA控制器(DMAC)。系统总线分别受到CPU和DMAC这两个部件的控制,即CPU 可以向地址总线、数据总线和控制总线发送信息(非DMA方式),DMAC也可以向地址总线、数据总线和控制总线发送信息(DMA方式)。
但在同一时刻,系统总线只能接受一个部件的控制。究竟哪个部件来控制系统总线,是通过这两个部件之间的“联络信号”控制实现的。DMA取得总线控制权前处于受控状态,此时,CPU可对DMAC进行初始化编程,也可从DMAC中读出状态,这时DMA处于从态,DMAC上电或复位时,DMAC自动处于从态。在DMAC获得总线控制权之后,DMAC取代CPU而成为系统总线的主控者,接管和控制系统总线。通过总线向存储器或I/O设备发出地址、读/写信号,以控制在两个实体之间的数据传送。这时候DMA处于主动态。DMA系统组成框图如图12.1所示。


二、F28335的DMA模块
F28335的DMA模块主要结构如图12.2所示,DMA数据传输是基于事件触发的,这就意味着DMA需要外设中断触发来启动DMA的数据传输。F28335共有18个不同的触发源,图中右边所示即为触发源,外设触发源见表12.1所示。其中有8个外部中断触发源,全部引自GPIO引脚,这样DMA的事件触发是很灵活的。DMA不能通过自身数据源定时触发,若要定时触发可以借助于外设中断触发源中CPU定时器来实现。F28335共有6个DMA通道,每个通道都可以有各自的触发源,通过各自独立的PIE中断告知CPU DMA数据传输的开始与结束,这6个通道中,第一通道有着更高的优先级。DMA模块的核心其实是一个与地址控制逻辑紧密关联的状态机,在数据传输过程中让数据块自动的重新配置,就好像是两个缓冲器之间在打乒乓球一样,我们把这种机制也叫做DMA的乒乓机制。DMA总线结构包括一个22位地址总线,一个32位数据读总线,和一个32位数据写总线,与DMA总线相连的资源,好比乒乓球运动员,分别数据传送的地址源与数据源,地址源与数据源的接口通过总线互相相连,这个接口DMA可能会访问,CPU也会访问。与DMA总线相连的资源如图中左边所示1、XINTF区域0、6、7;L4 SARAM、L5 SARAM、L6 SARAM、L7 SARAM 2、ADC存储器映射结果寄存器 3、MCBSP-A和MCBSP-B数据接收寄存器(DDR2/DDR1)和数据发送寄存器(DXR2/DXR1)4、映射到外设3的ePWM1-6/HRPWM1-6寄存器。


外设

  中断触发源

CPU

DMA软件位 (CHx.CONTROL.PERINIFRC)

ADC

排序器1中断排序器2中断

外部中断

外部中断1-7、外部中断13

CPU定时器

CPU定时器0、1、2溢出

McBSP-A、McBSP-B

发送缓冲器空、接收缓冲器满

Epwm1-6

ADC启动信号


F28335的DMA的基本特性如下:
(1) 6个DMA通道,6个通道都具有独立的PIE中断
(2) 外设中断触发源
       DMA模块是基于事件触发的,因此要求一个外设触发器启动DMA数据的传递。例如它能通过将一个定时器配置成中断触发源,从而变成一个周期性的定时驱动器,中断触发源可以为6个DMA通道分别单独配制。F28335的外设中断触发源如下:
——ADC排序器1和排序器2
——多路缓冲串行端口A和B(McBSP-A,McBSP-B)的发送和接收;
——XINT1-7和XINT13; 
——CPU计时器
——ePWM1-6 ADCSOCA和ADSOCB信号
——软件
(3) 数据源/目的地
  DMA传递数据的来源或者传输的目的地,主要如下:
——L4~L7 16K*16 SARAM
——所有XINTF区域(外扩的存储器)
——ADC的结果寄存器
——McBSP-A和McBSP-B发送和接收缓冲器
——ePWM1-6/HRPWM1-6外设第3帧映射寄存器
      ePWM/HRPWM寄存器被DMA访问之前必须被重新映射到PF3(通过MAPCNF寄存器的0位设置)。
(4) 字长:
 DMA传输数据的字长为:
——字的大小:16位或32位(McBSPs只限于16位)
——读写操作:4周期/字(对于McBSP 5周期/字进行读取)。

F28335的DMA模块的触发机制
    外设中断触发DMA数据传送的原理如图12.3所示。F28335的DMA每个通道都可以选择各自独立的触发源,触发源有18个,包括与GPIO引脚连接的8个外部中断触发源,这样的触发源的选择是很灵活的。在外设中断触发的时候,首先通过各自通道的模式寄存器(MODE.CHX)的外设中断触发源选择位(MODE.CHX(PERINTSEL))来选择触发源,有效的中断触发发生后,控制寄存器的外设中断触发标志位(PERINTFLG)会被置位,如果相应DMA通道的模式寄存器中的外设中断允许位(MODE.CHX. [PERINTE])是使能的,并且控制寄存器中运行状态位(CONTROL.CHx[RUNSTS])是允许的,该DMA通道就能响应数据传输服务了。在接收完一个外设中断触发信号后,DMA会自动地发一个清除信号给中断源,这样后续的中断事件

软件触发的时候可以不管通道模式寄存器中触发源的选择,可以通过控制寄存器中的外设中断强制位CONTROL.CHx[PERINTFRC]的置位来强制触发,同样,可以通过控制寄存器中的外设中断清除位CONTROL.CHx[PERINTCLR]位来清除挂起的DMA触发。
   一旦一个特定的中断触发置位了控制寄存器中的中断触发标志位PERINTFLG,该位一直保持置位(挂起)状态,直到状态机的优先级逻辑允许该通道进行数据传输,数据传输开始,标志位就被清零。数据正在传输过程中,而一个新的中断触发产生了,在正常的优先级别下,数据传输完成后才会去响应新的中断触发。如果那个新的中断触发还处在挂起状态,即未被执行,又来了一个新的中断触发,即第三个中断触发,这时候控制寄存器中的溢出标志位CONTROL.CHx[OVRFLG]会被置位以示错误。如果一个外设中断触发发生了,而与此同时标志位正在清除中,外设中断触发有一定优先权,外设中断标志位还是会被置位。
F28335的DMA模块的流水线机制
    DMA进行数据传输的时候采用了4级流水线,将数据传输主要分成了如下工序:产生数据源地址,输出数据源地址,读数据源数据,产生目的源地址,输出目的源地址,写目的源数据。如图12.4所示。有个例外的是,当将McBSP作为数据源时,读取McBSP DDR寄存器的值的时候,会拖延DMA一个时钟周期。如图12.5所示。


此外还有一些其它操作也会影响到DMA通道的吞吐
1、在每次数据传输之前要增加一个周期的延迟。
2、当从CH1高优先级中断返回时也会周期延迟。
3、32位传输速度是16位传输速度的两倍,传输1个32位的字与传输1个16位的字所花的时间是一样的。
4、与CPU的冲突可能增加延迟时间。
    例:从ADC到RAM传递128个16位的字,通道被配置成1波传递16个字,每个字要花4个时钟周期,8波能传完,总需时钟周期520个时钟周期
    8 bursts * [(4 cycles/word * 16 words/burst) + 1] = 520 cycles
    如果通道被配置成传递32位的字,传递过程为8 bursts * [(4 cycles/word * 8 words/burst) + 1] = 264 cycles,总需要时钟周期264个,所花时间差不多减半。也就是对DMA传输而言,采用32位数据线传输,若以16位为字进行传输,即一半吞吐量浪费了。

F28335的DMA模块的CPU仲裁机制
    通常情况下,DMA的运行是独立于CPU运行的。但是有时候DMA与CPU会同时通过同一个接口访问存储器或外设寄存器,这时候就需要进入CPU仲裁程序。例外的是,ADC寄存器(内存映射PF0)被CPU与DMA同时访问的时候不会有冲突,即使是访问不同的地址。访问任何一个不同的接口或者CPU要通过一个DMA正在访问的接口,即访问同一接口的时间是不同时的,都不会产生冲突。
有可能产生冲突的内部接口如下:
· XINTF 存储区域 0, 6 and 7
· L4 RAM
· L5 RAM
· L6 RAM
· L7 RAM
·外设帧3 (McBSP-A and McBSP-B)
1)访问外部存储器接口:
a、如果CPU和DMA在同一周期内访问任何一个XINTF区域,DMA被响应,CPU的所有访问被挂起(CPU访问正常的优先权顺序是写-读-获取)。
b、如果CPU访问一个XINTF的区域处于挂起状态或者正在被处理,此时DMA正试图访问该区域,DMA访问会被搁置,直到挂起的CPU访问完成为止。例如一个CPU的读或写的访问在挂起状态,CPU的获取访问在被执行中,首先是完成这个获取访问,然后是CPU的写,接着CPU的读,最后才DMA访问。
c、如果CPU与DMA同时试图进行写操作,则延时一个时钟周期。
如果DMA或者CPU写XINTF区域,那么XINTF的缓冲器有助于CPU或者DMA避免延迟。如果DMA或CPU读XINTF区域,那么会有明显的延迟。这里要注意的是,如果DMA被延迟,DMA可能会错过高优先权的DMA事件,如在产生高速率数据的ADC模块里的DMA传输。在这种情况下,就不能采用DMA来传输XINTF里的数据,DMA延迟时间太长,会丢失关键的DMA事件。
    DMA不支持半途中止XINTF的读操作。如果DMA正在访问XINTF的一个区域并且DMA访问被延迟了,CPU会发一个硬件重启HARDRESET指令来中止DMA的访问,HARDRESTE就像是DMA的系统重启命令,因此,HARDRESET会被应用XINTF上,以从外设崩溃的状态中恢复过来,XINTF与DMA中的写缓冲器的数据与被挂起的数据信息全部会丢失。
(2) 其他外设/存储器
a、CPU与DMA同一周期内访问相同接口,DMA优先,CPU被延迟。

  b、CPU正在访问,另一个CPU对同一接口的访问在挂起状态,如CPU正在进行写处理,一个读访问在挂起状态,CPU写操作完以后,DMA访问先于读访问执行。对于同一个接口,对于挂起的CPU访问而言,DMA访问有更高优先权。

如果CPU正在进行读-修改-写操作,DMA在相同位置上执行一个写操作,该操作正好发生在CPU读操作和写操作之间,则DMA的写操作可能会丢失,因此建议不要把CPU和DMA混在一起访问同一接口。

F28335的DMA模块的通道优先级机制
通道优先级确定时有两个方案:ROUND-ROBIN模式和通道1高优先级模式。
1、 ROUND-robin模式
    Round-robin模式就是轮次模式,在这个模式下,所有通道有着平等的优先权,每一个通道以“轮次”响应的形式被响应到。响应形式如下:CH1 -> CH2 -> CH3 -> CH4 -> CH5 -> CH6 -> CH1 -> CH2 -> 
    在上述情况下,每个通道发送一波字以后,下一个通道就会被响应,用户可以指定每个通道的一波字的数量,一旦第6通道(或者是最后一个被使能的通道)响应结束后,并且没有其余被挂起的响应,轮次模式状态机就进入了空闲状态。
2、通道1高优先级模式
    在这个模式中,通道1有高优先权。如果通道1触发事件发生,其余任何通道在当前字传完(还不是这一波传完)后即被终止,通道1响应,完成数据传送。数据传送完成后,又回到原来执行的传送中。除1以外的其余通道还是平等的,还是以轮次模式执行。
高优先级: CH1
低优先级: CH2 -> CH3-> CH4 ->CH5-> CH6 ->CH2 ???

F28335的DMA模块的地址指针与发送控制方法
    DMA模块的内部状态机是两级嵌套的循环结构,当一个外部设备的中断触发信号到来时,内部循环开始一次突发传送。一次突发传送被定义为一次传送的最小单位,可通过BURST_SIZE寄存器为每个通道设定突发传送的数据量。BURST_SIZE允许在一次突发传送中最多传送32个16位的字;通过TRANSFER_SIZE寄存器可设置每个外环的尺寸,并且定义在一次传送过程中突发传送的循环次数,由于TRANSFER_SIZE是一个16位的寄存器,所以在一次传送过程中总数据量可满足任何传送要求。在每次传送的开始或结尾,可以产生一次CPU中断,这是由MODE.CHX[CHINTMODE]位决定的。
        在MODE.CHX[ONESHOT]位默认设置下,DMA在一次外设中断触发下仅产生一次突发传送。当此次突发传送结束后,即使当前通道的触发信号再次到来,状态机也将根据优先级顺序移动到下一个通道,这样可以防止一个通道独占DMA总线。如果所要传送的总数据量大于一次突发传送的最大数据量;,那么可以通过将MODE.CHx[ONESHOT]置位来完成整个传送过程。但需要注意的是,在此模式下将会导致一次触发事件占用绝大部分的DMA带宽。
        每个DMA通道都包含源地址与目标地址的映射地址指针(即SRC_ADDR和DST_ADDR),这些指针在传送状态机运行过程中可独立控制,每次传送开始时,每个指针映射地址中的值将分别装载到其当前寄存器中。在内部循环运行时,每完成一个字的传送,源或目标寄存器BURST_STEP的值将被添加到当前SRC/DST_ADDR中。每次内环结束时,可采用两种方法清除当前地址指针:第一种(默认),将SRC/DST_TRANSFER_STEP寄存器中的标记值添加到相应的指针中;第二种,通过返回过程,返回地址将被加载到当前地址指针中,当返回过程开始时,SRC/DST_TRANSFER_STEP寄存器被忽略。

当SRC/DST_WRAP_SIZE寄存器中设定的突发传送次数完成时,发生地址返回。每个DMA通道有2个映射地址指针SRC_BEG_ADDR和DST_BEG_ADDR,从而允许源与目标独立控制。如果SRC_ADDR与DST_ADDR一样,那么在传送开始时当前寄存器SRC/DST_BEG_ADDR将从其自身映射单元中加载数据。当设定的突发传送次数完成时,一个返回过程将发生:
    (1)当前寄存器SRC/DST_BEG_ADDR将根据SRC/DST_WRAP_STEP寄存器中的标记值进行增加;
(2)当前寄存器SRC/DST_BEG_ADDR中的新值将装载到SRC/DST_ADDR当前寄存器中。
      另外,返回计数器(SRC/DST_WRAP_COUNT)将会重新加载SRC/DST_WRAP_SIZE的值,为下次返回做准备,这就允许在一次传送过程中产生多次返回操作。
     DMA的地址指针有当前寄存器与映射寄存器,从而允许用户在DMA工作时间为下次传送过程在映射寄存器中设定相应的值。具有映射单元的指针有:
     (1)源/目标地址指针(SRC/DST_ADDR)。映射寄存器中的值即为读/写操作的首地址,每次传送开始时,映射寄存器中的值将装载到当前寄存器中。
    (2)源/目标开始地址指针(SRC/DST_BEG_ADDR)。每次传送开始时,映射寄存器中的值将装载到当前寄存器中,当前寄存器的值在添加到SRC/DST_ADDR寄存器中之前将先根据SRC/DST_WRAP_STEP寄存器中的值增加。

对于每个通道,传送过程由以下长度值进行控制:
    (1)源和目标突发传送长度BURST_SIZE(内部循环次数)。BURST_SIZE定义了一次突发传送所传递字的个数,在突发传送开始前,BURST_SIZE的值被加载到BURST_COUNT寄存器中,每次完成一个字的传送,BURST_COUNT减1,直到归零时表明本次突发传送结束。当前通道的行为由MODE寄存器中ONE_SHOT位定义,每次突发传送的最大字数由外设决定;如果ADC的突发传送可为16个寄存器,则McBSP突发传送字的个数被限制为1,因为其没有接收与发送缓冲器。对于RAM单元,突发传送的最大字的个数可由BURST_SIZE设定为32。
    (2)源和目标传送次数TRANSFER_SIZE(外部循环次数)。TRANSFER_SIZE指定在每个CPU中断(如果被使能)产生前所发生的突发传送的次数。通过MODE 寄存器中的CHINTMODE位可将中断配置成在传送开始时触发中断或在传送结束时触发中断。MODE寄存器中的CONTINUOUS位可设定在传送完成后,当前通道是继续使能还是禁止工作。在传送开始时,TRANSFER_SIZE被装载到TRANSFER_COUNT寄存器中,TRANSFER_COUNT不断监视突发传送的次数,直到其归零时,表明DMA传送过程结束。
   (3)源/目标返回长度SRC/DST_WRAP_SIZE。SRC/DST_WRAP_SIZE定义了在当前地址指针返回开始位置前所发生的突发传送次数,用来实现一个环绕的地址类型功能。在传送开始时,SRC/DST_WRAP_SIZE的值被装载到SRC/DST_WRAP_COUNT寄存器中,SRC/DST_WRAP_COUNT监视突发传送所发生的次数,当归零时相应的源/目标地址指针的返回操作被执行。要禁止此项功能,设定此寄存器的值大于TRANSFER_SIZE的值。

对于每个源/目标指针,地址的改变可通过以下步长来控制:
     (1)源/目标突发传送步长SRC/DST_BURST_STEP。每次突发传送,源地址及目标地址的增量步长由此寄存器设定。寄存器中的值是有符号二进制形式,地址按要求增加或减少。如果像访问McBSP数据接收与发送寄存器时,不要求增量步进,可将此寄存器设为0。
     (2)源/目标传送步长SRC_DST_TlTRANSFER_STEP。定义了在当前突发传送完成后,下一个突发传送的地址偏移量。当访问的寄存器或内存单元存在固定的地址间隔,可使用此功能。
      (3)源/目标返回步长SRC/DST_WRAP_STEP。当返回计数器归零时,此寄存器定义了BEG_ADDR指针增加或减少字的个数,从而设定新的地址。
      注:不管DATASIZE的值如何设定,STEP寄存器的值默认为16位地址设定步长,如果增加一个32位地址,该寄存器应设定为2。
以下模式定义了DMA两级循环状态机的运行模式:
     (1)单次触发模式(ONESHOT)。在一次外设中断触发信号到来时,如果使能单次触发模式,则在TRANSFER_COUNT归零前DMA将连续执行突发传送。如果单次触发模式被禁止,则每次突发传送过程都要由中断触发信号进行触发,直到TRANSFER_COUNT归零。
     (2)连续触发模式(CONTINUOUS)。如果连续触发模式被禁止,那么在传送结束后将CONTROL寄存器中的RUNSTS位清零,禁止DMA通道工作。如果要在此通道发起又一次传送过程,则首先要将CONTROL寄存器中的RUN位置1,以重新启动通道。如果连续触发模式被使能,则RUNSTS位在每次传送结束不会被清除。
    (3)通道中断模式(CHINTMODE)。用来定义DMA中断是在传送开始时发生还是在传送结束时发生。如果要用连续模式实现"乒-乓"操作,则中断应在传送开始时发生;如果DMA没有工作在连续模式,则中断通常在传送结束时产生。

三、DMA模块的寄存器
四、DMA模块应用
楼主

您必须登录后才能进行回复或者发起新的主题