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

📄 qdmatest.c

📁 TI DSP tms320c6416 EDMA测试代码
💻 C
字号:
#include <std.h>
#include <stdio.h>
#include <csl_edma.h>
#include <csl_irq.h>

#include "qdmatestcfg.h"

typedef Void (*EDMA_ISRHandler)(Uint32 tccNum);

Uint32 BuffA[256];
Uint32 BuffB[256];

EDMA_ISRHandler EDMA_ISRFunc[64];

Void EDMA_ISROpen(Void);
Void EDMA_ISRDefault(Uint32 tccNum);
Void EDMA_ISRChan0(Uint32 tccNum);
Void EDMA_ISRChan16(Uint32 tccNum);
Void EDMA_ISRChan22(Uint32 tccNum);
Void EDMA_ISRDispatcher(Void);

Bool DMATran_bufComp(Uint32 *s, Uint32 *d, Uint32 sw, Uint32 dw, Uint32 shidx, Uint32 swidx, Uint32 dhidx, Uint32 dwidx, Uint32 hcnt, Uint32 wcnt);

///////////////////////////////////////////////////////////////
Void EDMA_ISRDefault(Uint32 tccNum)
{
	return;
}

///////////////////////////////////////////////////////////////
Void EDMA_ISRChan0(Uint32 tccNum)
{
	//Do what you want to do!
	return;
}

///////////////////////////////////////////////////////////////
Void EDMA_ISRChan16(Uint32 tccNum)
{
	//Do what you want to do!
	return;
}

///////////////////////////////////////////////////////////////
Void EDMA_ISRChan22(Uint32 tccNum)
{
	//Do what you want to do!
	return;
}

///////////////////////////////////////////////////////////////
Void main()
{
 
	printf("This project is used to test EDMA/QDMA!\n");
    EDMA_ISROpen();   
}

///////////////////////////////////////////////////////////////
Bool DMATran_bufComp(Uint32 *s, 		//源缓冲区
				  	 Uint32 *d, 		//目的缓冲区
			  	  	 Uint32 sw, 		//源缓冲区的宽度
				  	 Uint32 dw, 		//目的缓冲区的宽度
				  	 Uint32 shidx, 		//源缓冲区行索引
				  	 Uint32 swidx, 		//源缓冲区列索引
				  	 Uint32 dhidx, 		//目的缓冲区行索引
				  	 Uint32 dwidx, 		//目的缓冲区列索引
				  	 Uint32 hcnt, 		//待比较数据的行数
				  	 Uint32 wcnt)		//待比较数据的列数
{
	Uint32 i, j;
	
	for(i=0; i<hcnt; i++){
		for(j=0; j<wcnt; j++){
			if(*(s+i*shidx*sw+j*swidx) != *(d+i*dhidx*dw+j*dwidx)){
				return(FALSE);
			}
		}
	}
			
	return(TRUE);
}

///////////////////////////////////////////////////////////////
Void EDMA_ISRDispatcher(Void)
{
	Uint32 i,ciprh, ciprl;
	
	ciprl = EDMA_RGET(CIPRL);
	ciprh = EDMA_RGET(CIPRH);
	
	do{
		EDMA_RSET(CIPRL, 0xFFFFFFFF);
		EDMA_RSET(CIPRH, 0xFFFFFFFF);

		if(0 != ciprl){
			for(i=0; i<32; i++){
				if(ciprl & (1 << i)){
					EDMA_ISRFunc[i](i);
				}
			}
		}
	
		if(0 != ciprh){
			for(i=0; i<32; i++){
				if(ciprh & (1 << i)){
					EDMA_ISRFunc[i](i+32);
				}
			}
		}

		ciprl = EDMA_RGET(CIPRL);
		ciprh = EDMA_RGET(CIPRH);
	}while((0 != ciprl) || (0 != ciprh));
	
}

///////////////////////////////////////////////////////////////
Void EDMA_ISROpen(Void)
{
	Uint32 i;

	EDMA_resetAll();
	
	for(i=0; i<64; i++){
		EDMA_ISRFunc[i] = EDMA_ISRDefault;
	}
	
	IRQ_map(IRQ_EVT_EDMAINT, 8);
	IRQ_configArgs(IRQ_EVT_EDMAINT, EDMA_ISRDispatcher, IRQ_IEMASK_DEFAULT, IRQ_CCMASK_DEFAULT, 0);
	IRQ_enable(IRQ_EVT_EDMAINT);	
}

///////////////////////////////////////////////////////////////
Void QDMA_work(Void)
{
	Uint32	i, j;
	Uint32	flg;
	EDMA_Config	config;
	
	printf("Now Begin to Test QDMA!\n");
		
	//初始化中断;
	EDMA_intEnable(0);
	EDMA_ISRFunc[0] = EDMA_ISRChan0;
	
	for(i=0;i<16;i++){
		//初始化BuffA;
		for(j=0; j<256; j++){
			BuffA[j] = j+i;
			BuffB[j] = 0;
		}
		
		//配置QDMA;
		config.opt	= EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
								   EDMA_OPT_ESIZE_32BIT,
								   EDMA_OPT_2DS_YES,
								   EDMA_OPT_SUM_INC,
								   EDMA_OPT_2DD_NO,
								   EDMA_OPT_DUM_INC,
								   EDMA_OPT_TCINT_YES,
								   EDMA_OPT_TCC_OF(0),
								   EDMA_OPT_TCCM_OF(0),
								   EDMA_OPT_ATCINT_NO,
								   EDMA_OPT_ATCC_OF(0),
								   EDMA_OPT_PDTS_DISABLE,
								   EDMA_OPT_PDTD_DISABLE,
								   EDMA_OPT_LINK_NO,
								   EDMA_OPT_FS_YES);
		config.src	= (Uint32)BuffA;
		config.cnt	= (Uint32)0x00200006;
		config.dst	= (Uint32)BuffB;
		config.idx	= (Uint32)0x00080000;
		EDMA_qdmaConfig(&config);
		
     	//等待QDMA结束;    
     	printf("%d.QDMA transfering...",i);
     	do{
     		flg = EDMA_getPriQStatus();
     		flg = flg & (1 << EDMA_OPT_PRI_HIGH);
     		printf("...");
     	}while(!flg);
     	
     	//QDMA传输结束并检测结果;
     	if(DMATran_bufComp(BuffA, BuffB, 8, 6, 1, 1, 1, 1, 32, 6)){
     		printf("\n%d.QDMA transfer OK!\n",i);
     	}else{
     		printf("\n%d.QDMA transfer FAILED!\n",i);
     	}
     }     
}

Void EDMA_work(Void)
{
	Uint32	i, j;
	Uint32	flg;
	EDMA_Handle	hEDMA;
	EDMA_Handle hEDMATbl;
	EDMA_Handle hEDMAChain;
	EDMA_Config	config;

	printf("Now Begin to Test EDMA Link!\n");
		
	//Link功能测试;
	//初始化EDMA通道;
	hEDMA = EDMA_open(16, EDMA_OPEN_RESET);
	EDMA_clearChannel(hEDMA);
	EDMA_setEvtPolarity(hEDMA,EDMA_EVT_HIGHLOW);	
	EDMA_disableChannel(hEDMA);
	EDMA_intEnable(1);
	EDMA_ISRFunc[1] = EDMA_ISRChan16;
	hEDMATbl = EDMA_allocTable(-1);	
	for(i=0;i<16;i++){
		//初始化BuffA;
		for(j=0; j<256; j++){
			BuffA[j] = j+i;
			BuffB[j] = 0;
		}
		
		//配置EDMA;
		//参数表1.
		config.opt	= EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
								   EDMA_OPT_ESIZE_32BIT,
								   EDMA_OPT_2DS_NO,
								   EDMA_OPT_SUM_IDX,
								   EDMA_OPT_2DD_NO,
								   EDMA_OPT_DUM_IDX,
								   EDMA_OPT_TCINT_YES,
								   EDMA_OPT_TCC_OF(1),
								   EDMA_OPT_TCCM_OF(0),
								   EDMA_OPT_ATCINT_NO,
								   EDMA_OPT_ATCC_OF(0),
								   EDMA_OPT_PDTS_DISABLE,
								   EDMA_OPT_PDTD_DISABLE,
								   EDMA_OPT_LINK_YES,
								   EDMA_OPT_FS_YES);
		config.src	= (Uint32)BuffA;
		config.cnt	= (Uint32)0x00000080;
		config.dst	= (Uint32)BuffB;
		config.idx	= (Uint32)0x00000008;
		config.rld  = (Uint32)0x00000000;
		EDMA_config(hEDMA,&config);

		//参数表2.
		config.opt	= EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
								   EDMA_OPT_ESIZE_32BIT,
								   EDMA_OPT_2DS_NO,
								   EDMA_OPT_SUM_IDX,
								   EDMA_OPT_2DD_NO,
								   EDMA_OPT_DUM_IDX,
								   EDMA_OPT_TCINT_YES,
								   EDMA_OPT_TCC_OF(1),
								   EDMA_OPT_TCCM_OF(0),
								   EDMA_OPT_ATCINT_NO,
								   EDMA_OPT_ATCC_OF(0),
								   EDMA_OPT_PDTS_DISABLE,
								   EDMA_OPT_PDTD_DISABLE,
								   EDMA_OPT_LINK_YES,
								   EDMA_OPT_FS_YES);
		config.src	= (Uint32)(BuffA+1);
		config.cnt	= (Uint32)0x00000080;
		config.dst	= (Uint32)(BuffB+1);
		config.idx	= (Uint32)0x00000008;
		config.rld  = (Uint32)0x00000000;
		EDMA_config(hEDMATbl,&config);

		EDMA_link(hEDMA,hEDMATbl);	
		EDMA_link(hEDMATbl,EDMA_hNull);
		EDMA_setChannel(hEDMA);

     	//等待EDMA结束;    
     	printf("%d.EDMA transfering...",i);
     	do{
     		flg = EDMA_getPriQStatus();
     		flg = flg & (1 << EDMA_OPT_PRI_HIGH);
     		printf("...");
     	}while(!flg);
     	
		EDMA_setChannel(hEDMA);
     	do{
     		flg = EDMA_getPriQStatus();
     		flg = flg & (1 << EDMA_OPT_PRI_HIGH);
     		printf("...");
     	}while(!flg);

     	//EDMA传输结束并检测结果;
     	if(DMATran_bufComp(BuffA, BuffB, 8, 8, 1, 1, 1, 1, 32, 8)){
     		printf("\n%d.EDMA transfer OK!\n",i);
     	}else{
     		printf("\n%d.EDMA transfer FAILED!\n",i);
     	}
	}
	EDMA_freeTable(hEDMATbl);
	EDMA_close(hEDMA);

	printf("Now Begin to Test EDMA Chain!\n");
	
	//Chain功能测试;
	//初始化EDMA通道;
	hEDMA = EDMA_open(16, EDMA_OPEN_RESET);
	EDMA_clearChannel(hEDMA);
	EDMA_setEvtPolarity(hEDMA,EDMA_EVT_HIGHLOW);	
	EDMA_disableChannel(hEDMA);
	EDMA_intEnable(22);
	EDMA_ISRFunc[22] = EDMA_ISRChan16;
	
	hEDMAChain = EDMA_open(22, EDMA_OPEN_RESET);
	EDMA_clearChannel(hEDMAChain);
	EDMA_setEvtPolarity(hEDMAChain,EDMA_EVT_HIGHLOW);	
	EDMA_enableChannel(hEDMAChain);
	EDMA_intEnable(1);
	EDMA_ISRFunc[1] = EDMA_ISRChan22;

	for(i=0;i<16;i++){
		//初始化BuffA;
		for(j=0; j<256; j++){
			BuffA[j] = j+i;
			BuffB[j] = 0;
		}
		
		//配置EDMA;
		//参数表1.
		config.opt	= EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
								   EDMA_OPT_ESIZE_32BIT,
								   EDMA_OPT_2DS_NO,
								   EDMA_OPT_SUM_IDX,
								   EDMA_OPT_2DD_NO,
								   EDMA_OPT_DUM_IDX,
								   EDMA_OPT_TCINT_YES,
								   EDMA_OPT_TCC_OF(0),
								   EDMA_OPT_TCCM_OF(0),
								   EDMA_OPT_ATCINT_NO,
								   EDMA_OPT_ATCC_OF(0),
								   EDMA_OPT_PDTS_DISABLE,
								   EDMA_OPT_PDTD_DISABLE,
								   EDMA_OPT_LINK_NO,
								   EDMA_OPT_FS_YES);
		config.src	= (Uint32)BuffA;
		config.cnt	= (Uint32)0x00000080;
		config.dst	= (Uint32)BuffB;
		config.idx	= (Uint32)0x00000008;
		config.rld  = (Uint32)0x00000000;
		EDMA_config(hEDMA,&config);

		//参数表2.
		config.opt	= EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
								   EDMA_OPT_ESIZE_32BIT,
								   EDMA_OPT_2DS_NO,
								   EDMA_OPT_SUM_IDX,
								   EDMA_OPT_2DD_NO,
								   EDMA_OPT_DUM_IDX,
								   EDMA_OPT_TCINT_YES,
								   EDMA_OPT_TCC_OF(1),
								   EDMA_OPT_TCCM_OF(0),
								   EDMA_OPT_ATCINT_NO,
								   EDMA_OPT_ATCC_OF(0),
								   EDMA_OPT_PDTS_DISABLE,
								   EDMA_OPT_PDTD_DISABLE,
								   EDMA_OPT_LINK_NO,
								   EDMA_OPT_FS_YES);
		config.src	= (Uint32)(BuffA+1);
		config.cnt	= (Uint32)0x00000080;
		config.dst	= (Uint32)(BuffB+1);
		config.idx	= (Uint32)0x00000008;
		config.rld  = (Uint32)0x00000000;
		EDMA_config(hEDMAChain,&config);

		EDMA_chain(hEDMA,hEDMAChain,EDMA_TCC_SET,0);
		EDMA_enableChaining(hEDMAChain);
		EDMA_setChannel(hEDMA);

     	//等待EDMA结束;    
     	printf("%d.EDMA transfering...",i);
     	do{
     		flg = EDMA_getPriQStatus();
     		flg = flg & (1 << EDMA_OPT_PRI_HIGH);
     		printf("...");
     	}while(!flg);
     	
     	//EDMA传输结束并检测结果;
     	if(DMATran_bufComp(BuffA, BuffB, 8, 8, 1, 1, 1, 1, 32, 8)){
     		printf("\n%d.EDMA transfer OK!\n",i);
     	}else{
     		printf("\n%d.EDMA transfer FAILED!\n",i);
     	}
	}

}

⌨️ 快捷键说明

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