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

📄 master_main.c

📁 DSP编程
💻 C
字号:
//2007.11.16 by axia
//master DSP program
//dsp0/cpu1

#include <stdio.h>
#include <c6x.h>
#include <math.h>
#include "include.h"
#include "target.h"
#define TEST_SIZE	256
#pragma DATA_SECTION(Buffer_1,"STORE_IN_IRAM");
	INT16U Buffer_1[TEST_SIZE];
#pragma DATA_SECTION(Buffer_2,"STORE_IN_IRAM");
	INT16U Buffer_2[TEST_SIZE];
#pragma DATA_SECTION(Buffer_3,"STORE_IN_IRAM");
	INT8U Buffer_3[TEST_SIZE];   

volatile int exch_flag = 0;

extern far void RelocateISTP();
void InitDSP();	

int edma_start_8to16(int src, int dst, unsigned int ch, int sum, int dum, int islink, int size)
{ 
//	EDMA_REG *edma_reg = (EDMA_REG*)EVENT_PARAMS_ADDR(ch); 
	
	if((ch>=EDMA_CHANNEL_NUM)) 
      return 1;

  *(unsigned volatile int *)ECRL |= (1<<ch);		//clear  + (1<<DS)
    
  *(unsigned volatile int *)(EVENT_PARAMS_ADDR(ch) + OPT) = (EDMA_PRI<<PRI) + (2<<ESIZE)+ (sum<<SUM) 
  													+(dum<<DUM) + (islink<<LINK) + (1<<FS);//;//
 
  *(unsigned volatile int *)(EVENT_PARAMS_ADDR(ch) + SRC) = src;
  *(unsigned volatile int *)(EVENT_PARAMS_ADDR(ch) + DST) = dst;
  *(unsigned volatile int *)(EVENT_PARAMS_ADDR(ch) + IDX) = 0;//0x00020002; //;(size<<15);//---0x00020000;// 
   
  *(unsigned volatile int *)(EVENT_PARAMS_ADDR(ch) + CNT) = size;//(0x00020000+size/2);//---
  *(unsigned volatile int *)(EVENT_PARAMS_ADDR(ch) + LNK)= ((0xffff& NULL_PARAMS_ADDR)); //0x00020000;//+((size/2)<<16);

  *(unsigned volatile int *)CIERL |= (1<<ch);	//enable channel interrupt
  *(unsigned volatile int *)EERL |= (1<<ch);	//enable EVENT

  return 0;
}
// + (1<<TCINT)   + ((ch%16)<<TCC) + ((ch/16)<<TCCM)
void main()
{
	int i = 0, error = 0;
//	INT16U test[10];
	InitDSP();
	
	while(1)//main loop
	{
		error = 0;
		for(i = 0; i < TEST_SIZE;i++)
		{
			Buffer_1[i] = 0;
			Buffer_2[i] = 0;
			Buffer_3[i] = i;
		}
		edma_start_8to16((int)Buffer_3, (int)Buffer_1, CHANNEL_OF_INTERNAL_EXCH,
						INCREMENT_ADDR_MODE, INCREMENT_ADDR_MODE, 1, TEST_SIZE);
		SET_BIT(ESRL, CHANNEL_OF_INTERNAL_EXCH);				
		while(exch_flag ==0 );
		exch_flag = 0;
		for(i= 0;i < TEST_SIZE; i++)
			if((INT16U)Buffer_3[i] != Buffer_1[i])
				error++;
		printf("%d\n", error);
	}

}

void InitDSP()
{
	volatile int temp, i;
  
	// Initial the common control registers 
	CSR = (1<<EN);        //enable the little endian mode
	IER = (1<<NMIE);
	ICR = 0xffff;         //clear the all interruptions
	RelocateISTP();
  
	// Initial the EMIFA and EMIFB register
	*(volatile unsigned int *)EMIFA_GCR = EMIFA_GCR_PARAMS;			//EMIFA global control
	*(volatile unsigned int *)EMIFA_CE0 = EMIFA_CE0_PARAMS;			//32bit programmable sync for DSPs,与其他DSP数据通讯
	*(volatile unsigned int *)EMIFA_CE0SEC = EMIFA_CE0SEC_PARAMS;
	*(volatile unsigned int *)EMIFA_CE2 = EMIFA_CE2_PARAMS;			//通讯双口RAM
	*(volatile unsigned int *)EMIFA_CE2SEC = EMIFA_CE2SEC_PARAMS;
	*(volatile unsigned int *)EMIFA_CE3 = EMIFA_CE3_PARAMS;			//32bit programmable sync for FIFO,收图
	*(volatile unsigned int *)EMIFA_CE3SEC = EMIFA_CE3SEC_PARAMS;	// FWFT mode
   
	*(volatile unsigned int *)EMIFB_GCR = EMIFB_GCR_PARAMS;		//EMIFB global control
	*(volatile unsigned int *)EMIFB_CE0 = EMIFB_CE0_PARAMS;		//16bit sync for SDRAM
	*(volatile unsigned int *)EMIFB_CE1 |= EMIFB_CE1_PARAMS;	//8bit async for FLASH
	*(volatile unsigned int *)EMIFB_CE3 = EMIFB_CE3_PARAMS;		//16bit async for dual-RAM,显示图像
	*(volatile unsigned int *)EMIFB_SDCTRL = EMIFB_SDCTRL_PARAMS;
	*(volatile unsigned int *)EMIFB_SDRP = EMIFB_SDRP_PARAMS;
	*(volatile unsigned int *)EMIFB_SDEXT = EMIFB_SDEXT_PARAMS;
  
	//Initial the GPIO register
	*(volatile unsigned int *)GPEN |= GPEN_PARAMS;
	*(volatile unsigned int *)GPDIR = GPDIR_PARAMS;
	FIFO_01_LOW();
	FIFO_02_LOW();

	//Initial the EDMA registers
	REG_WRITE(CIERL, 0x0);
	REG_WRITE(CIERH, 0x0);
	REG_WRITE(CIPRL, 0xFFFF);
	REG_WRITE(CIPRH, 0xFFFF);
  
	REG_WRITE(EERL, 0x0);
	REG_WRITE(EERH, 0x0);
	REG_WRITE(ECRL, 0xFFFF);
	REG_WRITE(ECRH, 0xFFFF);
  
	edma_null_init();
             
/*
	*(unsigned volatile int *)QDMA_OPT = (QDMA_PRI<<PRI) + (1<<SUM) + (1<<DUM) + (1<<TCINT) 
										+ (CHANNEL_OF_TARNS_TO_DPRAM%16<<TCC)
										+ (CHANNEL_OF_TARNS_TO_DPRAM/16<<TCCM) + (1<<FS);
	*(unsigned volatile int *)QDMA_SRC = (int)img_buff;
	*(unsigned volatile int *)QDMA_DST = ADDR_OF_DUALPORT_RAM;
	*(unsigned volatile int *)QDMA_CNT = IMG_SIZE_IN_WORD;	
	*(unsigned volatile int *)CIERL |= (1<<CHANNEL_OF_TARNS_TO_DPRAM);
*/
	
	
	//Open the needed Interrupt,打开需要使用的
	ICR = IFR | ((1<<IF6)+(1<<IF8));
	IER |= ((1<<IF6)+(1<<IF8));
	CSR |= (1<<GIE);	
}

//从红外头收图中断
interrupt void RecOrg_isr()
{
}

//从DSP超时无响应中断
interrupt void timer1_isr()
{
}

//EDMA中断
interrupt void edma_isr()
{
	if(GET_BIT(CIPRL,CHANNEL_OF_INTERNAL_EXCH))
	{
		REG_WRITE(CIPRL,1<<CHANNEL_OF_INTERNAL_EXCH);
		exch_flag = 1;
	}
}

⌨️ 快捷键说明

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