📄 image.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 + -