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

📄 image.c

📁 该代码实现了 两次下载法在dspC6713平台上 烧写flash的操作过程
💻 C
字号:
/*****************************************************************************
* File name :     image.c
* Description:
******************************************************************************/


#include "image.h"
#include "math.h"
#include "edma.h"
#include "TIMER.h"
#include "C6711_INTR.C"
#include "C6711_EMIF.C"

#include "C6711_TIMER.C"

#include "edma.c"
#define MAX 0x7FFFFFFF
#define UINT volatile unsigned int
#define N		3 /*类别数 */

//#define Debug 1

double LCMDO_Addr[((N + 1) * N)/2];//纹理主方向类别共生矩阵地址LCM of Dominant Orientation of texture
double LCMV_Addr[((N + 1) * N)/2];//垂直方向类别共生矩阵地址LCM of Vertical Orientation
double LCMH_Addr[((N + 1) * N)/2];//水平方向类别共生矩阵地址LCM of Horizontal Orientation

/*******************************************************************************
*                     Function     prototypes
*******************************************************************************/

void IPB_init(void);
unsigned char Feature_Extraction(unsigned char *Dst_Addr);//特征提取

/*******************************************************************************
* FUNCTION : main
* ARGUMENTS :void
*******************************************************************************/
unsigned char flage=0,flag9=0,flag8=0,flag6=0,infoflag=0;
unsigned char buffer_data0[4096];  //4096*32bit  是以双字为单位的

unsigned char buffer_data1[4096];

unsigned char pci_cnt=0;
unsigned int  framecnt=0,test_cnt=0;
unsigned char pci_flag=0;
unsigned char cal_cnt=0,pingpongflag=0;
unsigned char defectsign[32],defectsend[8];

/*通过pci传递的相机参数变量*/
unsigned int internal_clockfrq;
unsigned int internal_occupation;
unsigned int decoder_occupation;
unsigned int decode_param;
/*通过pci传递的算法参数变量*/
unsigned char Label;
unsigned char Orientations;
unsigned char Threasholds0;
unsigned char Threasholds1;
unsigned int MaxBDE[4];
unsigned int MaxWDE[4];
int DeltaX[4];
int DeltaY[4];
int StartX[4];
int StartY[4];
int EndX[4];
int EndY[4];
int Delta[4];
void test_led();
unsigned int temppci[25];
void main (void)
{
	unsigned int i,j;
	unsigned int Camarareg_baseraddr=0xB000FFC0;//相机寄存器设置
	unsigned int Pci_baseaddr=0xA0004000; //pci起始地址
	IPB_init();
	test_led();
	for(i=0;i<25;i++)
		temppci[i]=(*(unsigned int *)(Pci_baseaddr+i*4));
	/*get the parameter from pci d-sram*/
	
	internal_clockfrq=temppci[0]; //曝光频率
	internal_occupation=temppci[1];//曝光 时间 
	decoder_occupation=temppci[2];
	decode_param=temppci[3];
	
	Label=(unsigned char)temppci[4];
	Orientations=(unsigned char)temppci[5];
	
	if(temppci[24]!=0x55AA) //初值判断 说明参数不正确
		{
			Orientations=0; 
			decoder_occupation=0x900;
			decode_param=0x538;
		}
	
	Threasholds0=(unsigned char)temppci[6];
	Threasholds1=(unsigned char)temppci[7];
	for(i = 0; i < Orientations; i ++)
	{
		MaxBDE[i]=(unsigned int)temppci[8+i];
		MaxWDE[i]=(unsigned int)temppci[12+i];
		DeltaX[i]=(int)temppci[16+i];
		DeltaY[i]=(int)temppci[20+i];
		StartX[i]=(DeltaX[i] > 0) ? 0 : -DeltaX[i];
		StartY[i]=(DeltaY[i] > 0) ? 0 : -DeltaY[i];
		EndX[i]=(DeltaX[i] > 0) ? 64-DeltaX[i] : 64;
		EndY[i]=(DeltaY[i] > 0) ? 64-DeltaY[i] : 64;
		Delta[i]=DeltaY[i]*64+DeltaX[i];
	}			
	(*(unsigned int *)(Camarareg_baseraddr)) = internal_clockfrq;//0x00002000; //内部时钟采样频率
	(*(unsigned int *)(Camarareg_baseraddr+8)) = internal_occupation;//0x00000800;  //内部时钟占空比
	(*(unsigned int *)(Camarareg_baseraddr+12)) = decoder_occupation;//0x0002000;//编码器时钟占空比
	(*(unsigned int *)(Camarareg_baseraddr+16)) = decode_param;//0x00000538;//;//0-1:增益 3-4:0  8:选择内外部时钟,9-13:分频比 14模拟数据
	/*+16 reg: bit 6-8 选择内外部时钟 100-内部 其他外部bit 0-1  增益  11-4*  00-8* */ 

	EDMA_init();//初始化EDMA
	*(volatile unsigned int *) CIPR = 0xffff;
// 	ISTP=0x000;//中断向量表重 定位
   	cal_cnt=0;	
   	IER=0x4113;//打开中断
 while(1)//endless interation
 {
	 if(flage)//flage is set to 1 in EDMA_Interrupt4() and set to 0 in the end of the required frame number
	 {
	    flage =0;
	 }
	 if(flag8) //向上位机器 发送信号 表示pci已经收到8侦数据
	 {
    	flag8=0;
	 }
	 //flag6=1;
	 if(flag6)  //计算 怎么终止一次计算呢? 在退出循环的时候清调flag6
	 {
	 	flag6=0; 
	 	test_cnt=0;
 		if(pingpongflag) //奇数
			{
			   	//led_blink2(0);//on
				defectsign[cal_cnt]=Feature_Extraction(buffer_data1);
		 		//led_blink2(1);//off	
		 		if((defectsign[cal_cnt])&&(cal_cnt>5)&&(cal_cnt<26))
		 			*(unsigned int *)GPVAL &= 0xFFF7; 
			}
		else  //oushu
			{
			   	//led_blink2(0);//on 高电平
				defectsign[cal_cnt]=Feature_Extraction(buffer_data0);
		 		//led_blink2(1);//off	
		 		if((defectsign[cal_cnt])&&(cal_cnt>5)&&(cal_cnt<26))
		 			*(unsigned int *)GPVAL &= 0xFFF7; 		 											
			}
		//在此处断点 可能计算途中新的数据已经传输完毕覆盖掉了label value			
		if(cal_cnt==30) 
		{			
			for(i=0;i<8;i++)
		  	{		  	
			defectsend[i]=i;//设置计数器信息
			for(j=0;j<4;j++)
				{
				 defectsend[i]<<=1;//先移位
				 defectsend[i]+=defectsign[i*4+j]&0x01;
				}
			//defectsend[i]+=i*16;
			}
			*(unsigned int *)GPVAL |= 0x08;	 
		}
		//if(cal_cnt>=32)cal_cnt=0;
		//在计算的时间段中edma6肯定传输完毕 为了防止错误的重新启动计算	
				//有必要在推出计算循环的时候清掉此标志
		//由于中断里面每次开始新的计算循环的时候都将cal_cnt清零
		//所以如果本循环能够退出来的话说明计算在规定时间内完成了 		
		//	StartTimer();
		//	pci_cnt=*(unsigned volatile int *)TIMER0_COUNT;			
 	}
 }
}
/********使用CAche影响中断**********/
void IPB_init() 
{

/*Initiate CPU Registers*/
//  CSR=0x109;			           /* disable all interrupts            */ 
  CSR=0x141;					   /*PCC=010 ennable Cache */
  *(unsigned int *)CCFG=0x0007;	   /*CCFG  L2MODE=010 32kcache +32ksram*/
  *(unsigned int *)MAR0=0x0003;	   /*enable cache address 0x80000000*/	
  IER=1;                           /* disable all interrupts except NMI */
  ICR=0xffff;                      /* clear all pending interrupts      */
  
  *(unsigned int *)GPEN|=0x08;//GPIO3 enable
  *(unsigned int *)GPDIR|=0x08;//GPIO3 output
  emif_init();
  intr_init();
// // timer0_init(0x0200,0xffffffff)
}

//******************************************************
void test_led(void)
{
	unsigned int 	test_ledadd1=0x1940000;//TIMER0_CTRL
	unsigned int	test_ledadd0=0x1980000;//TIMER1_CTRL
		
		(*(unsigned int *)test_ledadd1)|=0x04; //on
		
	//	(*(unsigned int *)test_ledadd0)&=0x0B;  
	//	for(i=0;i<0x3FFFFF;i++);	
	//	(*(unsigned int *)test_ledadd1)|=0x04;
	//	for(i=0;i<0x3FFFFF;i++);
		(*(unsigned int *)test_ledadd0)&=0x0B;//off
		  
    
}

⌨️ 快捷键说明

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