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

📄 imageprocessing.c

📁 DSP6416图像处理用多种算法对图像边缘进行检测
💻 C
字号:

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

*
* DESCRIPTION
*   DSP Program intended for
*   C6416 Board developed by Zhangjian to
*   display captured images with VGA formate. *   
*******************************************************************************/

#include "c64cfg.h"
#include <csl.h>
#include <csl_timer.h>
#include <csl_edma.h>

#define OutputRAM 0x60000000   //定义输入输出地址
#define InputRAM  0xA0000000
#define PingRAM   0x00020000
#define PangRAM   0x80000000
#define time1_ctl 0x01980000  

//add code here

#define Direct_Display          0  //直接显示 
#define ROBERTS                 0 //罗伯特交叉边缘检测算子
#define PREWITT                 0 //蒲瑞维特边缘检测算子3x3

#define H1PREWITT               0 //蒲瑞维特边缘方向梯度检测算子H1东
#define H2PREWITT               0 //蒲瑞维特边缘方向梯度检测算子H2东北
#define H3PREWITT               0 //H3北
#define H4PREWITT               0 //H4西北
#define H5PREWITT               0 //H5西
#define H6PREWITT               0 //H6西南
#define H7PREWITT               0 //H7南
#define H8PREWITT               0 //H8东南
#define HPREWITT                0 //综合方向


#define PREWITTx5_1             1  //prewitt5x5
#define PREWITT5x5_2            0  //prewitt5x5扩展
#define PREWITT7x7_1            0 //preiwtt7x7


//add code end

/*********************************************************************
                        系统初始化
********************************************************************/

void ini();
void int4_handle();
void edma_int_handle();
void bigpingpang(Uint32 hEdma0Opt,Uint32 hEdma1Opt,Uint32 InputBuffer,Uint32 OutputBuffer,Uint32 PingBuffer,Uint32 PangBuffer,Uint32 TrsanferNum,Uint32 EFIndex,Uint32 RLoadLink);

unsigned int field = 1; 

main()   //主函数
{
 	*(volatile int *)time1_ctl = 0x00000300;
  	ini();  
	field = 1;		
	IRQ_globalEnable();
	IRQ_enable(IRQ_EVT_EXTINT4); 
	
	IRQ_reset(IRQ_EVT_EDMAINT); 	
	EDMA_intDisable(8);
    EDMA_intClear(8);  
    IRQ_enable(IRQ_EVT_EDMAINT);     			
	EDMA_intEnable(8);

	
	*(int *)OutputRAM =0x0000;// 0x4080;
	*(volatile int *)time1_ctl = 0x00000304;
}

void ini()    //定义系统寄存器
{
    IRQ_globalEnable();
    IRQ_nmiEnable();
        
	#define EMIFA_GCTL       0x01800000
	#define EMIFA_CE1        0x01800004
	#define EMIFA_CE0        0x01800008
	#define EMIFA_CE2        0x01800010
	#define EMIFA_CE3        0x01800014
	#define EMIFA_SDRAMCTL   0x01800018
	#define EMIFA_SDRAMREF   0x0180001c
	#define EMIFA_SDRAMEXT   0x01800020
	#define EMIFA_CE1SECCTL  0x01800044
	#define EMIFA_CE0SECCTL  0x01800048
	#define EMIFA_CE2SECCTL  0x01800050
	#define EMIFA_CE3SECCTL  0x01800054

	#define EMIFB_GCTL       0x01A80000
	#define EMIFB_CE1        0x01A80004
	#define EMIFB_CE0        0x01A80008
	#define EMIFB_CE2        0x01A80010
	#define EMIFB_CE3        0x01A80014
	#define EMIFB_SDRAMCTL   0x01A80018
	#define EMIFB_SDRAMREF   0x01A8001c
	#define EMIFB_SDRAMEXT   0x01A80020
	#define EMIFB_CE1SECCTL  0x01A80044
	#define EMIFB_CE0SECCTL  0x01A80048
	#define EMIFB_CE2SECCTL  0x01A80050
	#define EMIFB_CE3SECCTL  0x01A80054
	
	*(int *)EMIFA_GCTL     = 0x000120a4;	
	*(int *)EMIFA_CE2      = 0x1091c211;// change  0x1091c211,old :0x1091c221
	*(int *)EMIFA_CE0      = 0xffffffdf;
	*(int *)EMIFA_SDRAMCTL = 0x47116000;
	*(int *)EMIFA_SDRAMREF = 0x00000600;
	*(int *)EMIFA_SDRAMEXT = 0x00054549;
	
	*(int *)EMIFB_GCTL     = 0x000120a4; 
	*(int *)EMIFB_CE0 = 0x1091c211;	// change  0x1091c211
}

void int4_handle()  
{	
	bigpingpang(0x61380001,0x21200001,InputRAM,OutputRAM,PingRAM,PangRAM,0x00004000,0x00000000,0x0000ffff);
}

void bigpingpang(Uint32 hEdma0Opt,Uint32 hEdma1Opt,
                 Uint32 InputBuffer,Uint32 OutputBuffer,Uint32 PingBuffer,Uint32 PangBuffer,
                 Uint32 TrsanferNum,Uint32 EFIndex,Uint32 RLoadLink)
{	

	Uint32 tempinputbuffer,tempoutputbuffer,temppingbuffer,temppangbuffer;
	IRQ_disable(IRQ_EVT_EXTINT4);	
	switch(field)
	{
	 case 1:
	 	tempinputbuffer  = InputBuffer ;
	 	tempoutputbuffer = OutputBuffer+0x00010000;
	 	temppingbuffer   = PingBuffer;
	 	temppangbuffer   = PangBuffer+0x00010000;
	 break;
	 case 2:
	 	tempinputbuffer  = InputBuffer+0x00010000 ;
	 	tempoutputbuffer = OutputBuffer+0x00000004;
	 	temppingbuffer   = PingBuffer+0x00010000;
	 	temppangbuffer   = PangBuffer+0x00020004;
	 break;
	 case 3:
	 	tempinputbuffer  = InputBuffer ;
	 	tempoutputbuffer = OutputBuffer+0x00010000;
	 	temppingbuffer   = PingBuffer+0x00020000;
	 	temppangbuffer   = PangBuffer+0x00030000;
	 break;
	 case 4:
	 	tempinputbuffer  = InputBuffer+0x00010000 ;
	 	tempoutputbuffer = OutputBuffer+0x00000004;
	 	temppingbuffer   = PingBuffer+0x00030000;
	 	temppangbuffer   = PangBuffer+0x00040004;
	 break;
	 case 5:
	 	tempinputbuffer  = InputBuffer ;
	 	tempoutputbuffer = OutputBuffer+0x00010000;
	 	temppingbuffer   = PingBuffer+0x00040000;
	 	temppangbuffer   = PangBuffer+0x00050000;
	 break;
	 case 6:
	 	tempinputbuffer  = InputBuffer+0x00010000 ;
	 	tempoutputbuffer = OutputBuffer+0x00000004;
	 	temppingbuffer   = PingBuffer+0x00050000;
	 	temppangbuffer   = PangBuffer+0x00060004;
	 break;
	 case 7:
	 	tempinputbuffer  = InputBuffer ;
	 	tempoutputbuffer = OutputBuffer+0x00010000;
	 	temppingbuffer   = PingBuffer+0x00060000;
	 	temppangbuffer   = PangBuffer+0x00070000;
	 break;
	 case 8:
	 	tempinputbuffer  = InputBuffer+0x00010000 ;
	 	tempoutputbuffer = OutputBuffer+0x00000004;
	 	temppingbuffer   = PingBuffer+0x00070000;
	 	temppangbuffer   = PangBuffer+0x00000004;
	//	temppangbuffer   = PingBuffer+0x00000004;
	 	field = 0;
	 break;
	 default: break;	
	}	

	EDMA_configArgs(hEdmaCha0,
				hEdma0Opt, // opt
				tempinputbuffer, // src 
				TrsanferNum, // cnt 
				temppingbuffer, // dst
				EFIndex,  // idx 
				RLoadLink  // rld 
				);
			
	EDMA_configArgs(hEdmaCha1,
				hEdma1Opt, // opt
				temppangbuffer, // 
				TrsanferNum, // cnt 
				tempoutputbuffer, // dst
				EFIndex,  // idx 
				RLoadLink  // rld
				);		 	
	EDMA_setChannel(hEdmaCha1);	 
	EDMA_setChannel(hEdmaCha0);	    		
	field = field + 1;	
	IRQ_enable(IRQ_EVT_EXTINT4);		 
}   

void edma_int_handle()
{	
	unsigned long i,j;
	Uint16 *inputbuffer16,*outputbuffer16,*temp16;
	Uint32 *inputbuffer32,*outputbuffer32,*tempin32,*tempout32;	   	

	EDMA_intDisable(8);    
    EDMA_intClear(8);   
   	switch(field)
 	{
 		case 2:
 			inputbuffer16  = (Uint16 *)(PingRAM);
 			outputbuffer16 = (Uint16 *)(PangRAM);
 			inputbuffer32  = (Uint32 *)(PingRAM);
 			outputbuffer32 = (Uint32 *)(PangRAM);
 		break;
 		case 3:
 			inputbuffer16 = (Uint16 *)(PingRAM+0x00010000);
 			outputbuffer16 = (Uint16 *)(PangRAM+0x00010000);
 			inputbuffer32 = (Uint32 *)(PingRAM+0x00010000);
 			outputbuffer32 = (Uint32 *)(PangRAM+0x00010000);
 		break;
 		case 4:
 			inputbuffer16 = (Uint16 *)(PingRAM+0x00020000);
 			outputbuffer16 = (Uint16 *)(PangRAM+0x00020000);
 			inputbuffer32 = (Uint32 *)(PingRAM+0x00020000);
 			outputbuffer32 = (Uint32 *)(PangRAM+0x00020000);
 		break;
 		case 5:
 			inputbuffer16 = (Uint16 *)(PingRAM+0x00030000);
 			outputbuffer16 = (Uint16 *)(PangRAM+0x00030000);
 			inputbuffer32 = (Uint32 *)(PingRAM+0x00030000);
 			outputbuffer32 = (Uint32 *)(PangRAM+0x00030000);
 		break;
 		case 6:
 			inputbuffer16 = (Uint16 *)(PingRAM+0x00040000);
 			outputbuffer16 = (Uint16 *)(PangRAM+0x00040000);
 			inputbuffer32 = (Uint32 *)(PingRAM+0x00040000);
 			outputbuffer32 = (Uint32 *)(PangRAM+0x00040000);
 		break;
 		case 7:
 			inputbuffer16 = (Uint16 *)(PingRAM+0x00050000);
 			outputbuffer16 = (Uint16 *)(PangRAM+0x00050000);
 			inputbuffer32 = (Uint32 *)(PingRAM+0x00050000);
 			outputbuffer32 = (Uint32 *)(PangRAM+0x00050000);
 		break;
 		case 8:
 			inputbuffer16 = (Uint16 *)(PingRAM+0x00060000);
 			outputbuffer16 = (Uint16 *)(PangRAM+0x00060000);
 			inputbuffer32 = (Uint32 *)(PingRAM+0x00060000);
 			outputbuffer32 = (Uint32 *)(PangRAM+0x00060000);
 		break;
 		case 1:
 			inputbuffer16 = (Uint16 *)(PingRAM+0x00070000);
 			outputbuffer16 = (Uint16 *)(PangRAM+0x00070000);
 			inputbuffer32 = (Uint32 *)(PingRAM+0x00070000);
 			outputbuffer32 = (Uint32 *)(PangRAM+0x00070000);
 		break;
 		default: break;
 	}
 	  
#if Direct_Display		   	 		   	 			
	for( i = 0; i < 0x4000; i++ )
	{
		*((Uint32 *)outputbuffer32 + i) = *((Uint32 *)inputbuffer32 + i); 
	}

#endif
   
//add code here 
#if ROBERTS
    
   	 roberts((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

#endif //ROBERTS

#if PREWITT
    
   	 prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //prewitt

#if H1PREWITT
    h1prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
    
#endif  //h1prewitt

#if H2PREWITT
    
   	 h2prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //h2prewitt

#if H3PREWITT
    
   	 h3prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //h3prewitt

#if H4PREWITT
    
   	 h4prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //h4prewitt


#if H5PREWITT
    
   	 h5prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //h5prewitt

#if H6PREWITT
    
   	 h6prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //h6prewitt

#if H7PREWITT
    
   	 h7prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //h7prewitt

#if H8PREWITT
    
   	 h8prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //h8prewitt


#if HPREWITT
    
   	 hprewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);

					
#endif //hprewitt




#if PREWITT5x5_1
    
	 prewitt5x5_1((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64); 
					
#endif  // PREWITT5x5_1

#if PREWITT5x5_2
    
	prewitt5x5_2((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64); 
					
#endif //PREWITT5x5_2

#if PREWITTx7_1
    
	pit7x7_1((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64); 
					
#endif // PREWITT7x7_1



#if PREWITT7x7_1
    
	prewitt7x7_1((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64); 
					
#endif // PREWITT




//add code end




	EDMA_intEnable(8);
}


⌨️ 快捷键说明

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