⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma.c

📁 TMS320VC5509A 用CSL配置DMA的代码程序
💻 C
字号:
#include<stdio.h>
#include<csl.h>
#include<csl_dma.h>
#include<csl_irq.h>
#define  N   128

interrupt void fun_dma(void);
void init_dma(void)   ;

#pragma DATA_SECTION(src,"section_xx")
Uint16 src[N];  
#pragma DATA_SECTION(dst,"section_yy")
Uint16 dst[N];

DMA_Config dmaconfig=
{
  DMA_DMACSDP_RMK(
      0,                            //DMA_DMACSDP_DSTBEN_NOBURST,
      0,							//DMA_DMACSDP_DSTPACK_OFF,
   	  1,							//DMA_DMACSDP_DST_DARAM,0-SARAM,1-DARAM,2-EMIF,3-外设
   	  0,							//DMA_DMACSDP_SRCBEN_NOBURST,
      0,							//DMA_DMACSDP_SRCPACK_OFF,
      1,							//DMA_DMACSDP_SRC_DARAM,0-SARAM,1-DARAM,2-EMIF,3-外设
      1 							//DMA_DMACSDP_DATATYPE_16BIT 0-8bit,1-16bit,2-32bit
  ),                                       /* DMACSDP  */
  DMA_DMACCR_RMK(
      1, 						    	//DMA_DMACCR_DSTAMODE_POSTINC,地址自动增加模式
      1,								//DMA_DMACCR_SRCAMODE_POSTINC,地址自动增加模式
      0, 								//DMA_DMACCR_ENDPROG_OFF,0-编程就绪,1-编程结束
      0,								//DMA_DMACCR_REPEAT_OFF,编程结束时才自动初始化
      0,								//DMA_DMACCR_AUTOINIT_OFF,
      0,								//DMA_DMACCR_EN_STOP,禁止DMA
      0,								//DMA_DMACCR_PRIO_HI,低优先权
      0,								//DMA_DMACCR_FS_ENABLE,0-每单元的传输都需要同步信号,1-每帧的传输都需要同步信号
      15 								//DMA_DMACCR_SYNC_NONE 15到20分别对应int0到int5,用来产生DMA同步信号,以启动DMA数据传输
  ),                                       /* DMACCR   */
  DMA_DMACICR_RMK(
      0,								//DMA_DMACICR_BLOCKIE_OFF,块中断使能,每输完一块数据就产生一次中断
      0,								//DMA_DMACICR_LASTIE_OFF,最后帧中断使能,开始传输最后帧时产生中断
      1,								//DMA_DMACICR_FRAMEIE_ON,帧中断使能,每输完一帧数据就产生一次中断
      0,								//DMA_DMACICR_FIRSTHALFIE_OFF,半帧中断使能,每帧输完一半时产生中断
      0,								//DMA_DMACICR_DROPIE_OFF,同步事件旁落中断使能,产生同步事件旁落时产生中断
      0							    	//DMA_DMACICR_TIMEOUTIE_OFF,超时中断使能,每超时一次即产生一次中断
  ),                                       /* DMACICR  */
    (DMA_AdrPtr)&src,                     /* DMACSSAL */
    0,                                     /* DMACSSAU */
    (DMA_AdrPtr)&dst,                      /* DMACDSAL */
    0,                                     /* DMACDSAU */
    N,                                     /* DMACEN  一帧的单元数目 */
    1,                                     /* DMACFN  每块的帧数目 */
    0,                                     /* DMACFI   */
    0                                      /* DMACEI   */
};

extern void VECSTART(void);

volatile Uint16 count=0;  
    
DMA_Handle   mydma    ;

Uint16 dma_eventid,old_intm;

void main(void)
{ 
 Uint16 i;
 for (i=0;i<=(N-1);i++) 
      {
        dst[i]=0;
        src[i]=i+1;
      }
 CSL_init() ;
 IRQ_setVecs((Uint32)(&VECSTART));
 old_intm=IRQ_globalDisable();
 
 init_dma()  ;
 
 IRQ_globalEnable()  ;
 
 DMA_start(mydma)    ;   
 
 while(count!=1)     ;
  
 IRQ_globalRestore(old_intm);
 DMA_close(mydma)    ;
}


void init_dma(void)
{
 Uint16 srcaddressh,srcaddressl,dstaddressh,dstaddressl;
 //由于DMA采用的是字节寻址,而src,dst是数据空间的地址常量,代表的是字地址,
 //所以需要经过下面方法将字地址转换为字节地址,即将字地址左移一位就转换为字节地址
 srcaddressh=(Uint16)(((Uint32)&src)>>15)&0xffffu;;
 srcaddressl=(Uint16)(((Uint32)dmaconfig.dmacssal)<<1)&0xffffu;
 dstaddressh=(Uint16)(((Uint32)&dst)>>15)&0xffffu;
 dstaddressl=(Uint16)(((Uint32)dmaconfig.dmacdsal)<<1)&0xffffu;
 dmaconfig.dmacssal=(DMA_AdrPtr)srcaddressl;
 dmaconfig.dmacssau=srcaddressh;
 dmaconfig.dmacdsal=(DMA_AdrPtr)dstaddressl;
 dmaconfig.dmacdsau=dstaddressh;
 mydma=DMA_open(DMA_CHA0, DMA_OPEN_RESET);//打开DMA通道0
 dma_eventid=DMA_getEventId(mydma);
 IRQ_clear(dma_eventid);
 IRQ_plug(dma_eventid,&fun_dma);
 DMA_config(mydma,&dmaconfig);
 IRQ_enable(dma_eventid);
}


interrupt void fun_dma( void )
{
 count++;
 DMA_stop(mydma);
 printf("dma transmition has been finished");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -