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

📄 image_s_m.c

📁 DSP6713的测试程序
💻 C
字号:
/***************************************************
 *
 *		Program for reg dsp image board
 *
 *============   image_s_m.c   ============
 *
 *       trasfer data width is 8 bit
 *
 ***************************************************
 *
 *
 *	"BRIGHT"			0--16  
 *					( 16:max ,0:dark ) 
 * 	
 *
 ***************************************************/


#define BRIGHT	16			/*0--16  (0---dark, max 16) */

/*----------------------------------------------------------*/

#include <stdio.h>
#include <csl.h>
#include <csl_cache.h>
#include <csl_edma.h>
#include <csl_timer.h>
#include <csl_irq.h>


#define TCCINTNUM   10

#define IMAGE_WIDTH     280
#define IMAGE_HIGHT		140

#define  EDMA_SOURCE_ADDR	0xa0000000         //edma source addr is dsk flash 

#pragma DATA_ALIGN(line_buffer,128);
#pragma DATA_ALIGN(ImageBuffer,128);

unsigned char line_buffer[IMAGE_WIDTH];

far unsigned char ImageBuffer[IMAGE_WIDTH*IMAGE_HIGHT];   //IMAGE_WIDTH*IMAGE_HIGHT

#define FLASH_SIZE		0x40000 
#define FLASH_START		0x90000000
#define FLASH_END		(FLASH_START + FLASH_SIZE)

#define FLASH_ADR1		0x90000555
#define FLASH_ADR2		0x900002AA
#define FLASH_KEY1		0xAA
#define FLASH_KEY2		0x55
#define FLASH_KEY3		0xA0
#define FLASH_KEY4		0x80
#define FLASH_KEY5		0x10

void EraseFlash(void)
{
			

	/* Code to erase AMD29LV400B
	 * 4MBit (256K X 8) Flash Memory
	 */
	*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY1;
	*(volatile char *)FLASH_ADR2 = (char)FLASH_KEY2;
	*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY4;

	*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY1;
	*(volatile char *)FLASH_ADR2 = (char)FLASH_KEY2;
	*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY5;
	
	/* Spin here 'til erasing completes
	 */
//	while(GetFlashVal(FLASH_START) != 0xff)
        ;/* Do Nothing!*/	
		
	return;
}



volatile int frame_counter;
volatile int line_counter ;
volatile int sampling_stop;
volatile int frame_sam_end=0;
volatile int get_sampling;

int i,j;
unsigned char *pixel_p;
FILE *file;
extern far void vectors();

void setupInterrupts(void);
void stopEdma(void); 

EDMA_Handle hEdma;
EDMA_Config cfgEdma;

/* Create the EDMA configuration structure for line_buffer transfers */

EDMA_Config cfgEdma = {
  EDMA_OPT_RMK(
    EDMA_OPT_PRI_LOW,
    EDMA_OPT_ESIZE_8BIT,
    EDMA_OPT_2DS_NO,
    EDMA_OPT_SUM_INC,
    EDMA_OPT_2DD_NO,
    EDMA_OPT_DUM_INC, 
    EDMA_OPT_TCINT_YES,
    EDMA_OPT_TCC_OF(TCCINTNUM),
    EDMA_OPT_LINK_NO,
    EDMA_OPT_FS_YES
    ),

  EDMA_SRC_OF(EDMA_SOURCE_ADDR),
  EDMA_CNT_OF(IMAGE_WIDTH),
  EDMA_DST_OF(line_buffer),
  EDMA_IDX_OF(0x00000000),
  EDMA_RLD_OF(0x00000000)
};
                         
/*------------------------------------------------------

		AD9814  parameters

------------------------------------------------------*/

unsigned short ad_init_com_w[8]={	//ad9814 control words
					0x0040,				//   
					0x10c0,				//		MUX
					0x2015,				//		Red PGA
					0x3000,				//		Green PGA	
					0x4000,				//		Blue PGA
					0x51fe,				//59		Red Offset
					0x6000,				//		Green Offset
					0x7000,};			//		Blue Offset

#define	AD_COM_ADDR0 (unsigned char *)0xb0000400;	//wr clear
#define	AD_COM_ADDR1 (unsigned char *)0xb0000440;	//wr b7=1:sample  b7=0 stop
											//	 b6=1,AD0_LOAD=1;b6=0,AD_LOAD=0
											//	 b5=1,AD1_LOAD=1;b5=0,AD_LOAD=0

#define	AD_COM_ADDR2 (unsigned char *)0xb0000480;	//wr b4--b0=0-10000; cis_led britness

#define	AD_COM_ADDR3 (unsigned char *)0xb00004c0;	//w ad_init
#define	AD_COM_ADDR4 (unsigned char *)0xb0000500;	//w ad_init

#define	test_ (unsigned char *)0xb0000540;	//test led4

extern far void vectors();

unsigned char *ad_com_addr_p;
unsigned char *ad_com_addr_p1;

union
	{	unsigned short Tw;
		unsigned char Tb[2];
	} value;

#pragma DATA_ALIGN(temp,4);
#pragma DATA_ALIGN(tmp00,4);
volatile short temp;
//volatile 
unsigned char tmp00;

/************************************************************

   parameters and functions for dip and led control

**************************************************************
   

   cis init functions for sampling control  

********************************************************/

void cis_bright(unsigned char cis_led_bright)	   // cis_led_bright=0--16
{
	tmp00=cis_led_bright;		
	ad_com_addr_p=AD_COM_ADDR2;
	*ad_com_addr_p=tmp00;
}

void stop_sampling(){
	tmp00=0x40;		
	ad_com_addr_p=AD_COM_ADDR1;
	*ad_com_addr_p=tmp00;
	get_sampling=0;
}

void start_sampling(){
	tmp00=0xc0;		
	ad_com_addr_p=AD_COM_ADDR1;
	*ad_com_addr_p=tmp00;
}

//-----------------------------------------
void clear_sampling(){
	tmp00=0x0;		
	ad_com_addr_p=AD_COM_ADDR0;
	*ad_com_addr_p=tmp00;
}
//-----------------------------------------
void ad_init(){

	tmp00=0x40;			          
	ad_com_addr_p=AD_COM_ADDR1;
	*ad_com_addr_p=tmp00;

	for( i=0;i<8;i++ )
	{

//i=0;
		tmp00=0x00;							//laod=1	
		*ad_com_addr_p=tmp00;				//SCLK=0

		value.Tw=ad_init_com_w[i];

		ad_com_addr_p=AD_COM_ADDR3
		ad_com_addr_p1=AD_COM_ADDR4;

		for( j=0; j<16; j++ )
		{
			tmp00=value.Tb[1];

			tmp00=tmp00 & 0x80;
			*ad_com_addr_p++=tmp00;			//DATA=BIT 7
			*ad_com_addr_p1++=tmp00;		//SCLK
		
			value.Tw=value.Tw<<1;

		}
			
		tmp00=0x40;							//laod=0		
		ad_com_addr_p=AD_COM_ADDR1;
		*ad_com_addr_p=tmp00;
	}

}


/*****************************************/

void start_edma(){

  sampling_stop=0;
  line_counter=0;
  frame_sam_end=0;  

  pixel_p=ImageBuffer;

  setupInterrupts();  /* defined below */
    
  EDMA_clearPram(0x00000000);

  hEdma = EDMA_open(EDMA_CHA_EXTINT4, EDMA_OPEN_RESET);
/*  EDMA event select int4               */

  EDMA_config(hEdma, &cfgEdma);   


  EDMA_intDisable(TCCINTNUM);
  EDMA_intClear(TCCINTNUM);  
  EDMA_intEnable(TCCINTNUM);        
  EDMA_enableChannel(hEdma);   

  IRQ_enable(IRQ_EVT_EDMAINT);

#ifdef TIMER_I
  TIMER_start(hTimer);
#endif

}
/**************************************************

                  image preprocess

-------------------------------------------------*/

void pre_process(){
  unsigned char *inbuff;
  int x;

  inbuff = line_buffer;

  for (x=0; x<IMAGE_WIDTH; x++) 
    *pixel_p++ = *inbuff++;
    


  inbuff=pixel_p-IMAGE_WIDTH;  

  CACHE_wbInvL2(inbuff, (IMAGE_WIDTH+1), CACHE_WAIT);

  inbuff = line_buffer;

  CACHE_clean(CACHE_L2,inbuff,(IMAGE_WIDTH+1));


}


/****************************************************

					frame_process


----------------------------------------------------*/
void frame_process(){

/*   add prog. to processing image      */
  {


  }

}

/**************************************************/

void setupInterrupts(void)
{

	IRQ_setVecs(vectors);     /* point to the IRQ vector table	*/

    IRQ_nmiEnable();
    IRQ_globalEnable();
     
    IRQ_map(IRQ_EVT_EDMAINT, 8);
    IRQ_reset(IRQ_EVT_EDMAINT);
     
} 

/*********************************************/

interrupt void    
c_int08(void)    
{
  /* Clear the pending interrupt from the EDMA interrupt pending register */

  EDMA_intClear(TCCINTNUM);
  
  pre_process();

//  printf("\n %2d - %2d ",line_counter,frame_sam_end); 

  line_counter++;

  if (line_counter < IMAGE_HIGHT){

//  EDMA_link(hEdma,hEdmaline_buffer);

  }

  else{

	frame_sam_end=1;

    stopEdma();

    }
  
    return;

} 
//----------------------------------------------------
void stopEdma(void) {

    /*Disable interrupts, close EDMA channel before exit of the program*/

    IRQ_disable(IRQ_EVT_EDMAINT);
    EDMA_RSET(CCER,0x00000000);
    EDMA_disableChannel(hEdma);
    EDMA_intDisable(TCCINTNUM);
    EDMA_intClear(TCCINTNUM);

 	EDMA_close(hEdma);
 	EDMA_resetAll();
 	EDMA_RSET(CIPR,0xFFFFFFFF);
 	EDMA_RSET(ECR,0xFFFFFFFF);
}
#define PLL_BASE_ADDR   0x01b7c000
#define PLL_PID         ( PLL_BASE_ADDR + 0x000 )
#define PLL_CSR         ( PLL_BASE_ADDR + 0x100 )
#define PLL_MULT        ( PLL_BASE_ADDR + 0x110 )
#define PLL_DIV0        ( PLL_BASE_ADDR + 0x114 )
#define PLL_DIV1        ( PLL_BASE_ADDR + 0x118 )
#define PLL_DIV2        ( PLL_BASE_ADDR + 0x11C )
#define PLL_DIV3        ( PLL_BASE_ADDR + 0x120 )
#define PLL_OSCDIV1     ( PLL_BASE_ADDR + 0x124 )
#define CSR_PLLEN          0x00000001
#define CSR_PLLPWRDN       0x00000002
#define CSR_PLLRST         0x00000008 
#define CSR_PLLSTABLE      0x00000040
#define DIV_ENABLE         0x00008000

#define EMIF_GCTL       0x01800000
#define EMIF_CE1        0x01800004
#define EMIF_CE0        0x01800008
#define EMIF_CE2        0x01800010
#define EMIF_CE3        0x01800014
#define EMIF_SDRAMCTL   0x01800018
#define EMIF_SDRAMTIM   0x0180001C
#define EMIF_SDRAMEXT   0x01800020
#define EMIF_CCFG       0x01840000;
#define SDRAM_BASE_ADDRESS    0x80000000
#define SDRAM_SIZE      0x400000

void init_emif( void )
{
	*(int *)EMIF_GCTL     = 0x00000078;
	*(int *)EMIF_CE0      = 0xffffff93;  /* CE0 SDRAM                   */
	*(int *)EMIF_CE1      = 0xffffff13;  /* CE1 asyn Flash 16-bit       */
	*(int *)EMIF_CE2      = 0x02208802;  /* CE2 PSD RAM 8-it            */
	*(int *)EMIF_CE3      = 0x02208802;  /* CE3 I/O     8-bit           */
//	*(int *)EMIF_SDRAMCTL = 0x53115000;  /* SDRAM control               */
//	*(int *)EMIF_SDRAMTIM = 0x00000578;  /* SDRAM timing (refresh)      */
//	*(int *)EMIF_SDRAMEXT = 0x000a8529;  /* SDRAM Extension register    */
}

void  init_pll( void )
{

    *(int *)PLL_CSR  &= ~CSR_PLLEN;
    *(int *)PLL_CSR  |= CSR_PLLRST;
    *(int *)PLL_DIV0    = DIV_ENABLE + 0;  
	*(int *)PLL_MULT    = 2;        //  CPU_CLK   50MHz       
//	*(int *)PLL_MULT    = 4;        //  CPU_CLK   100MHz       
//	*(int *)PLL_MULT    = 6;        //  CPU_CLK   150MHz        
//	*(int *)PLL_MULT    = 8;        //  CPU_CLK   200MHz        
    *(int *)PLL_OSCDIV1 = DIV_ENABLE + 3;
    *(int *)PLL_DIV3    = DIV_ENABLE + 1; 
    *(int *)PLL_DIV2    = DIV_ENABLE + 1; 
    *(int *)PLL_DIV1    = DIV_ENABLE + 1;    //CUP clk =  pll out
    *(int *)PLL_CSR  &= ~CSR_PLLRST;
    *(int *)PLL_CSR |= CSR_PLLEN;
    
//	while(*(int *)PLL_CSR &0x00000040==0x0) {}

}
void interrupt time( void );
void initInterrupt(void);

void save_image(){
    char fname[20],frame[5];
//    FILE *file;
    strcpy(fname,"C:\\");
    sprintf(frame, "%d", frame_counter);
	strcat(fname,frame);
    if((file=fopen(fname,"wb"))==NULL)
    return;
    fwrite(ImageBuffer,1,IMAGE_WIDTH*IMAGE_HIGHT,file);     
    fclose(file);
    }
	unsigned char *p00;                            //for test mem
	unsigned char tmp001;                        //for test mem 

test(void)
{
	tmp001=0x80;                       //for test mem			          
	
		p00=test_;
		for(i=0;i<0x300000;i++)
		{
		*p00=tmp001;    //write
		if(i%2==0)tmp001=0x80;
		 else tmp001=0x0;
		}
		for(i=0;i<0x300000;i++)
		{
		*p00=tmp001;    //write
		if(i%2==0)tmp001=0x80;
		 else tmp001=0x80;
		}
		for(i=0;i<0x300000;i++)
		{
		*p00=tmp001;    //write
		if(i%2==0)tmp001=0x80;
		 else tmp001=0x0;
		}
		for(i=0;i<0x300000;i++)
		{
		*p00=tmp001;    //write
		if(i%2==0)tmp001=0x80;
		 else tmp001=0x80;
		}
		for(i=0;i<0x300000;i++)
		{
		*p00=tmp001;    //write
		if(i%2==0)tmp001=0x80;
		 else tmp001=0x0;
		}

}

mem_test(void)
{
	unsigned short *p00;                            //for test mem
	short tmp001;                        //for test mem 
	tmp001=0xaaaa;                       //for test mem			          
	while(1)
	{
		p00=(unsigned short *)0x90000000;
		for(i=0;i<0x80000;i++)
		{
//		tmp001=*p00;		//read
		p00++;
		*p00=tmp001;    	//write
		tmp001++;
		}
	}
}
/*  ---------------------------------------*/
void main(){

    init_pll();
	init_emif();
   
	tmp00=0x40;			          
	ad_com_addr_p=AD_COM_ADDR1;
	*ad_com_addr_p=tmp00;
    CSL_init();

//	EraseFlash();


	clear_sampling();
	stop_sampling();
	test();

//	mem_test();

//	while(1)
	ad_init();	

	cis_bright(BRIGHT);
	
	get_sampling=1;
	sampling_stop=0;
	frame_counter=0;
  	get_sampling=1;

	while(1)   
		{
	
	  if( get_sampling==1 ){

		while( sampling_stop==0 ){

			start_sampling();
			start_edma();


	   	    while( frame_sam_end==0 )  	{  	}

			stop_sampling();
			frame_process();
	
			printf("\nf= %2d",frame_counter); 
//			save_image();
	  		frame_counter++;

		}
  	  }
	}
}

⌨️ 快捷键说明

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