DSP28335 中DMA的配置和使用

本文根据下面的链接整理而成:

http://bbs.elecfans.com/jishu_900708_1_1.html

http://bbs.21ic.com/icview-690422-1-1.html

http://blog.csdn.net/wu159632/article/details/7543599

http://bbs.21ic.com/icview-800778-1-1.html

 

依次来看:

 

零:

该文档记述了ADC在使用EPWM1的SOCA触发情况下,用DMA直接将Result0-16搬到存储区的方法。此方法而不需要使用ADC中断来存出结果,从而节约了CPU资源。使用该方法需注意以

下几点:
   1.DMA是从Result0-16的映射区取转化结果,即DMASource= &AdcMirror.ADCRESULT0;
   2.目的地址需要在RAML4-RAML7,即#pragma DATA_SECTION(DMABuf1,"DMARAML4");DMABuf1是目的变量名,即DMADest=&DMABuf1[0];
   3.DMA如果采用SEQ1触发,需将SEQ1的中断打开,即AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;但是不需要手动清除SEQ1的中断标志,ADC工作在启停模式下,每次转化完成后也不

需要复位排序器,即不需要每次设置AdcRegs.ADCTRL2.bit.RST_SEQ1=1;因为DMA每次存储后他会自动清除中断标志和复位排序器。
   4.DMA传输结果时,对于原地址和目的地址的移动主要通过三种方式来执行,
   1)burst传输;burst传输是由每一个ADC中断标志触发,ADC每次转化完成,该传输模式启动,原地址和目的地址的移动通过计数方式执行,首先要告诉原地址的首地址,即

DmaRegs.CH1.SRC_BEG_ADDR_SHADOW = (Uint32)DMA_Source;= &AdcMirror.ADCRESULT0;其次得告知每次出发传输多少数据,即DmaRegs.CH1.BURST_SIZE.all = bsize,如bsize=9,

就是一次burst传输10个数据;然后要告诉下次发送数据的地址和接收数据的地址,即DmaRegs.CH1.SRC_BURST_STEP = srcbstep;DmaRegs.CH1.DST_BURST_STEP = desbstep,传输一

个16位或32位数据,将执行一次地址偏移(原地址的首地+DmaRegs.CH1.SRC_BURST_STEP和目的首地址+DmaRegs.CH1.DST_BURST_STEP), DmaRegs.CH1.BURST_SIZE.all也将减1,

当 DmaRegs.CH1.BURST_SIZE.all=0时,本次burst传输完成。
   2)transfer传输,transfer传输有两个功能。一是确定多少次transfer传输后来执行DMA中断,二是确定下次burst传输的原首地址和目的首地址,他都是在上一次burst传输完

成后,源和目的地址的基础上进行偏移,transfer传输由三个寄存器管理,DmaRegs.CH1.TRANSFER_SIZE = tsize;
他告诉DSP多少次burst传输,执行DMA中断一次,如tsize=9,就是10次burst传输中断一次。DmaRegs.CH1.SRC_TRANSFER_STEP = srctstep;这个寄存器告诉DSP下次burst传输的源

首地址,他是在上次burst传输的最后一个源数据的地址上进行偏移;DmaRegs.CH1.DST_TRANSFER_STEP = deststep,这个寄存器告诉DSP下次burst传输的目的首地址,他是在上次

burst传输的最后一个目的地址上进行偏移;
   3)wrap传输,可实现循环传输,DmaRegs.CH1.SRC_WRAP_SIZE = srcwsize;是指源burst传输srcwsize+1后,源地址就要返回,下次burst传输源的首地址为

DmaRegs.CH1.SRC_ADDR_SHADOW +DmaRegs.CH1.SRC_WRAP_STEP;DmaRegs.CH1.SRC_ADDR_SHADOW是本轮wrap传输DmaRegs.CH1.SRC_BEG_ADDR_SHADOW的映射寄存器值,

DmaRegs.CH1.SRC_WRAP_STEP为wrap传输源的首地址偏移量。DmaRegs.CH1.DST_WRAP_SIZE = deswsize;是指burst传输deswsize+1后,目的地址就要返回,下次burst传输目的首地

址为DmaRegs.CH1.DST_ADDR_SHADOW+DmaRegs.CH1.DST_WRAP_STEP;DmaRegs.CH1.DST_ADDR_SHADOW,是本轮wrap传输DmaRegs.CH1.DST_ADDR_SHADOW的映射寄存器值,

DmaRegs.CH1.DST_WRAP_STEP为传输目的首地址偏移量(transfer传输,DmaRegs.CH1.DST_TRANSFER_STEP是相对于最受一个数据的地址偏移量)。所以wrap传输和transfer传输二

选一与burst传输搭配即可。要想屏蔽wrap传输,需将DmaRegs.CH1.SRC_WRAP_SIZE和DmaRegs.CH1.DST_WRAP_SIZE的值设定的比DmaRegs.CH1.TRANSFER_SIZE大。
   5.即使在使用wrap传输时,只要burst传输次数达到DmaRegs.CH1.TRANSFER_SIZE,在DMA中断开启的情况下,DMA还是会进入中断。
   6.在非持续模式下,如果想在某段地址内采用覆盖式存储,需在中断内对源和目的首地址重新赋值,并要重新令DmaRegs.CH1.CONTROL.bit.RUN = 1。
   7.在持续模式下,如果想在某段地址内采用覆盖式存储,只需在中断内对源和目的首地址重新赋值。

  下面以ADC 6通道,转化50次一次中断为例,来配置地址偏移。
采用transfer传输:
DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
DMACH1BurstConfig(5,1,50);
DMACH1TransferConfig(49,-5,-250+1);
DMACH1WrapConfig(100,100,100,100);//禁止wrap传输
采用wrap传输
DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
DMACH1BurstConfig(5,1,50);
DMACH1WrapConfig(0,0,5,1);
DMACH1TransferConfig(49,0,0)//如果要50次一中断,DmaRegs.CH1.TRANSFER_SIZE =49;

 

一、官网例程

DMACH1BurstConfig(3,1,10);//
DMACH1TransferConfig(9,1,0);//
DMACH1WrapConfig(1,0,0,1);//

cnsxgh回复:

楼主这个例子应该是ADC-DMA里面的。那根据楼主这个程序,应该只有3个通道。假设是ADC1,ADC2,ADC3,ADC4。
相应的目标地址是DMA[0]-DMA[30]。
DMACH1BurstConfig(3,1,10);//这里,BURST3个字,表示ADC有四个通道。源地址步长是1,表示源地址指针ADC1完了就是ADC2再完了就是ADC3
//目标地址步长是10,表示ADC1的数据挪到DMA[0],ADC2的数据挪到DMA[10],ADC3的数据挪到DMA[20].
DMACH1TransferConfig(9,0,1);//9,表示了一共采10次。
DMACH1WrapConfig(0,0,0,1);//第一个0,表示一Transfer后,就要进行地址回绕,第二个0,回绕步长不增长。第四个,1,表示目标地址回绕后增加1.即第二轮采采集时,ADC1->DMA[1],ADC2->DMA[11],ADC3->DMA[21]

 

二、用帧数、帧内个数来解释

 

DMA(Direct Memory Access),即直接存储器存取,是一种快速传送数据的机制。它的优点在于一旦控制器初始化完成,数据开始传送,DMA就可以脱离CPU,独立完成数据传送。不需要依于CPU的大量中断负载,从而节省大量的CPU资源。

TMS320F28335具有6通道DMA,而且每个通道具有独立的PIE中断。DMA的触发源种类有很多,可以配置为ADC、MCBSPs、外部中断、CPU定时器、ePWM1-6 ADCSOCA and ADSOCB和软件等出发方式。DMA可以对L4-L7 16Kx16 SARAM、XINTF外部接口、ADC、MCBSPs、ePWM1-6/HRPWM1-6映射到Peripheral Frame 3空间的寄存器进行数据操作。工作方式可以配置为32位或者16位。吞吐量最高为4时钟/字。需要注意的是,当DMA对MCBSPs进行数据操作时,只能配置为16位工作模式,而且最大的吞吐量为5时钟/字。具体原因参考一下TI的数据手册。下面以TI的例程为例详细讲解一下DMA配置。

28335 DMA的配置主要是一下几个函数,可以在DSP2833x_DMA.c找到。

函数及配置详解:

void DMACHxAddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source)

参数解析:配置DMA的数据目的地址和源地址(跟函数中参数的排序相同,下同)。

void DMACHxBurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)

参数解析:配置每帧大小、帧内源地址增加偏移和帧内源地址增加偏移。地址增加偏移就是指传输一个字(或帧)之后地址增量。

void DMACHxTransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)

参数解析:配置每次触发DMA转移多少帧、帧间源地址增加偏移和帧间源地址增加偏移。

void DMACHxWrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep)

参数解析:配置源地址偏移总量、重载的源地址、目的地址偏移总量、重载的目的地址。也就是说在源地址(或者目的地址)偏移量超过所设置的偏移总量的时候重载所设置的新的源地址(或者目的地址)。我是这么理解的。

void DMACHxModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte)

参数解析:配置触发源选择、触发源使能、ONESHOT使能、继续模式使能、外设同步使能、同步对象选择(源同步还是目的同步)、溢出中断使能、工作方式选择(16位还是32位)、产生中断模式选择(开始还是结束)、产生中断使能。

 

三、用脉冲个数及帧来解释

 

  void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source)
        源地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)
        目的地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)
        每次启动DMA相应通道,都会把B装载入A
        void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)
        Bsize: 每一个脉冲传递的字的个数,实际脉冲数为bsize+1
        Srcbstep:每传递一个字后,源地址A增量
        Desbstep:每传递一个字后,目的地址A增量

        void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)
        Tsize:每一帧的脉冲个数,脉冲递减到0时(即一帧传递完成,也是DMA传递完成),产生DMA中断。实际帧数为tsize+1
        Srctstep:每个脉冲的最后一个字传递结束后,源地址A增量
        Deststep:每个脉冲的最后一个字传递结束后,目的地址A增量

        void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep)
        Srcwsize:当已经传递的脉冲数为srcwsize+1的整数倍时,源地址(B)增加srcwstep(常为0),并装载入源地址A
        Deswsize:当已经传递的脉冲数为deswsize+1的整数倍时,目的地址(B)增加deswstep(常为0),并装载入目的地址A

        void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte)
        Persel:选择触发DMA的外设中断源
        Perinte:外设中断使能,
        Oneshot:使能时,外设产生一次中断,就能够把一帧传递完。禁止,外设产生一次中断,只能传递一个脉冲
        Cont:使能时,每次DMA结束后,需要再次启动DMA时,就不需要调用void StartDMACH1(void)。禁止时,重启DMA,需要调用void StartDMACH1(void)
        Datasize:设置每个字是16位或者32位
        Chintmode:设置DMA中断是在DMA启动或者结束时产生
        Chinte:DMA相应通道的中断使能(外设级)。
        注:Perinte和Chinte同时使能时,才能进入DMA通道中断
        仅Perinte使能,可以传输数据,但是不进入通道的中断程序

        void StartDMACH1(void)
        首次启动DMA,若Cont为禁止,每次DMA结束后,需要再次启动DMA时需要调用
        只开启相应用于触发的外设级中断,不开启PIE对应位,则能够触发DMA而不触发CPU的中断程序
        经过DMACH1ModeConfig配置的中断,DMA会自动清除相应外设级的中断标志位,不用程序清除。

 

三个一结合,就看明白了。

转载于:https://www.cnblogs.com/dujianzw/p/6148768.html

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DSP28335是一款基于TI(德州仪器)的TMS320F28335芯片的数字信号处理器。DMA(直接内存存取)是一种硬件协助的数据传输机制,可以实现高效的数据传输和处理。 DSP28335DMA是通过DMA控制器实现的。DMA控制器是一个独立于CPU的硬件模块,它能够在不占用CPU资源的情况下,直接从外设读取数据,并将数据存储到内存,或者将内存的数据传输到外设。相比于CPU执行数据传输和处理操作,DMA可以大大提高系统的效率和响应速度。 DSP28335DMA具有以下特点和优势: 1. 高速传输:DMA可以以非常高的速度传输数据,可以在多个外设和内存之间进行并行传输,大大缩短数据传输的时间。 2. 解放CPU:DMA的工作不需要CPU的干预,所以可以将CPU从数据传输和处理的任务解放出来,从而提高系统的整体处理能力。 3. 灵活配置DMA支持多种传输模式和数据宽度,可以根据具体应用需求进行灵活配置。它可以支持不同类型的外设,并具有多个DMA通道,可以同时进行多个数据传输和处理操作。 4. 减少能耗:由于DMA可以在不需要CPU参与的情况下完成数据传输任务,所以可以降低系统的功耗。 总之,DSP28335DMA是一种高效、灵活和节能的数据传输方式,它可以大大提高系统的性能和效率,在数字信号处理等领域有着广泛的应用。 ### 回答2: DSP28335 DMA是德州仪器(Texas Instruments)公司推出的一种数字信号处理器(DSP)的外设,用于数据传输和处理。DMA代表直接内存访问,它的作用是在不需要CPU干预的情况下,实现设备之间的数据传输。 DSP28335 DMA具有多个通道,每个通道都可以独立地进行数据传输。它可以与外部设备如ADC(模数转换器)、DAC(数模转换器)以及内部存储器之间进行数据传输。与传统的CPU传输方式相比,使用DMA可以显著减少CPU的负担,提高系统的处理效率。 在使用DMA时,首先需要配置DMA的通道和传输参数,包括源和目的地址、数据长度等。然后,通过设置DMA的触发源和优先级等配置寄存器,使得DMA能够在适当的时机进行数据传输。一旦配置完成,DMA将自动根据设置的参数进行数据传输,无需CPU的干预。 DSP28335 DMA的应用非常广泛。它可以用于音频和视频信号的处理,实现实时数据传输和处理;也可以用于外部外设的数据采集与控制,实现高速数据传输;还可以用于内部存储器和外部存储器之间的数据传输,提高存储器读写的效率。 总之,DSP28335 DMA是一种功能强大的外设,通过它可以实现高效的数据传输和处理,提高系统的性能和效率。 ### 回答3: DSP28335 DMA(Direct Memory Access,直接内存访问)是德州仪器(Texas Instruments)生产的一款数字信号处理器(DSP)芯片,该芯片具有高性能和低功耗的特点。 DMA是一种特殊的数据传输方式,它能够实现外设设备和内存之间的直接数据传输,无需CPU的干预。DSP28335DMA子系统包含了多个DMA通道,可以同时支持多个外设设备之间的数据传输,大大提高了系统的数据传输效率。 DSP28335DMA具有以下特点: 1. 高带宽:DMA通道之间的数据传输速度非常快,能够满足对高带宽数据传输的要求,如音频、视频等应用领域。 2. 灵活性:DSP28335DMA支持多种数据传输模式,如单次传输、循环传输和触发传输等,以满足不同应用场景的需求。 3. 断支持:DMA传输完成后,可以触发断请求,通知CPU数据传输完成,这样CPU可以及时处理传输完成的数据。 4. 简化CPU负担:DMA通道的数据传输由DMA控制器完成,不需要CPU的干预,大大减轻了CPU的负担,提高了系统的并发处理能力。 5. 节省功耗:由于DMA的功能与传输无关,所以在数据传输期间CPU可以进入低功耗状态,以节省系统功耗。 总之,DSP28335DMA技术可以有效地提高外设设备和内存之间的数据传输效率,减轻CPU的负担,提高系统性能,广泛应用于各种需要高效数据传输的嵌入式系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值