video_isr.c

来自「bf533平台图像采集程序」· C语言 代码 · 共 81 行

C
81
字号


#include <cdefBF533.h>


extern int D1, width, height;
extern char* frame_buf;

char frame_flag;

int image_line = 0;

//section("down_sample_image")	char SDRAM_DOWNSAMPLE_OUT[2097152]; 
#define LINE_BUFFER_WIDTH (720*2)
//section("data1")		char PPI_DMA_IN[LINE_BUFFER_WIDTH*4];
#pragma align 32
char PPI_DMA_IN[LINE_BUFFER_WIDTH*4];

int x = 0;

/* Defining an ISR 
#pragma interrupt_reentrant  
#pragma interrupt 
section("L1_code") void DMA0_PPI_ISR(void) 
*/
EX_INTERRUPT_HANDLER(DMA0_PPI_ISR);
EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{
	unsigned char *s, *y, *u, *v;
	int y_len = width*height, u_len = y_len / 4;
	
	//disable the interrupt request
	*pDMA0_IRQ_STATUS = 0x1;
	
	if(D1)
	{
		if(x == 1)
		{
			asm("nop;");
		}
		s = PPI_DMA_IN + ((image_line&0x4) >> 1) * LINE_BUFFER_WIDTH;
		y = frame_buf + image_line*width;
		u = frame_buf + y_len + ( (image_line+1) /2) * width /2;
		v = frame_buf + y_len + u_len + ( (image_line+1) /2) * width /2;
		
		convert2d1(s, y, v, u, width, (width)*2, LINE_BUFFER_WIDTH);
	
		image_line += 4;
		
		if (image_line == height) 
			image_line = 1; //odd field completed
		
		if (image_line == height+1) 
		{//whole frame completed
			image_line = 0;
			
			frame_flag = 1;
		}
		x++;
	}
	else
	{
		s = PPI_DMA_IN + ((image_line&0x2) >> 1) * LINE_BUFFER_WIDTH;
		y = frame_buf + image_line*width;
		u = frame_buf + y_len + ( image_line/2) * width /2;
		v = frame_buf + y_len + u_len + ( image_line/2) * width /2;
		
		convert2cif(s, y, v, u, width, width, LINE_BUFFER_WIDTH);
	
		image_line += 2;
		
		if (image_line == height) 
		{//odd field completed
			image_line = 0;
			
			frame_flag = 1;
		}
	}
}//end DMA0_PPI_ISR

⌨️ 快捷键说明

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