摄像头采集,黑白,240*240。我的目的是把采集数据放到一个240*30行的缓冲区中,每行中断一次,中断中对本行与相邻行的数据进行计算。
我理解 FLOW_AUTO | DI_SEL ,就是每行中断一次,如果缓冲区设置为120行(*pDMA0_Y_COUNT=120),则第121行数据又写到了第1行缓冲区。把2次缓冲区的数据拼起来,就是完整的一帧240行。
我按照这种理解写程序,发现不对,百思不得其解,还请再指教一下。
能否给个摄像头乒乓缓冲区的代码参考一下呢?
#define CMOS_WIDTH 240
#define CMOS_HEIGHT 240
#define BUFFER_HEIGHT 240 //240时采集正常,改为120,60,则不对了
unsigned int lineIndex=0;
void Video_Frame_Capture(void)
{
lineIndex=0;
*pPPI_FRAME = CMOS_HEIGHT; //这里永远是240吧?
*pPPI_COUNT = CMOS_WIDTH-1;
*pPPI_DELAY = 0;
*pPPI_CONTROL = 0x01AC;
*pDMA0_START_ADDR = ydata_buffer;
*pDMA0_X_COUNT = CMOS_WIDTH>>1;
*pDMA0_X_MODIFY = 0x2;
*pDMA0_Y_COUNT = BUFFER_HEIGHT;
*pDMA0_Y_MODIFY = 0x2;
*pDMA0_PERIPHERAL_MAP = 0x0;
*pDMA0_CONFIG = WNR | WDSIZE_16| DMA2D | RESTART | DI_EN | FLOW_AUTO | DI_SEL;
*pDMA0_CONFIG |= DMAEN;
ssync();
*pPPI_CONTROL |= PORT_EN;
ssync();
}
EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{
int i,j;
int bufferLine,bufferLineNext,displayLine,displayBufferIndex,bufferIndex,bufferIndexNextLine;
unsigned char y;
*pDMA0_IRQ_STATUS = 0x1;
bufferLine=lineIndex % BUFFER_HEIGHT; //lineIndex表示中断的次数,也就是摄像头的第几行,从0开始,bufferLine表示摄像头的这行数据存储在DMA缓冲区的哪一行
bufferIndex=CMOS_WIDTH*bufferLine; //bufferIndex表示该行第0像素的位置
displayLine=lineIndex % CMOS_HEIGHT; //displayLine表示yDisplayBuffer_565的第几行
displayBufferIndex=2*CMOS_WIDTH*displayLine; //displayBufferIndex表示第0像素的位置
//把DMA缓冲区的一行数据,搬移到显示缓冲区yDisplayBuffer_565
for(i=0;i<CMOS_WIDTH;i++)
{
y=ydata_buffer[bufferIndex];
yDisplayBuffer_565[displayBufferIndex+1] = y&0xf8;
yDisplayBuffer_565[displayBufferIndex+1] |= (y>>5)&0x07;
yDisplayBuffer_565[displayBufferIndex] = (y<<3)&0xe0;
yDisplayBuffer_565[displayBufferIndex] |= (y>>3)&0x1f;
bufferIndex++;
displayBufferIndex+=2;
}
//全部240行搬移完毕后,在屏幕上显示出来
if(lineIndex==(CMOS_HEIGHT-1))
{
Write_pic(yDisplayBuffer_565,CMOS_HEIGHT,CMOS_WIDTH,0,0);
}
lineIndex++; //每一行中断一次
lineIndex %= CMOS_HEIGHT;
}
当设置缓冲区为完整的一帧(240行)时,图像采集正常(正常图像左下、右下两个角是黑的)。此时,*pPPI_FRAME =240,*pDMA0_Y_COUNT = 240;使用1遍缓冲区。
当设置缓冲区为1/2帧(120行)时,图像跳变,正常图像和错位图像交替出现(见图)。此时,*pPPI_FRAME =240,*pDMA0_Y_COUNT = 120;使用2遍缓冲区。设置*pPPI_FRAME =120,现象一样,第1行到第240行的数据能在某个时刻某个位置显示出来,只是不能按顺序拼成完整的一帧。
当设置缓冲区为1/4帧(60行)时,图像滚屏(应该是多个子图交替错位),(见图)。此时,*pPPI_FRAME =240,*pDMA0_Y_COUNT = 60;使用4遍缓冲区。设置*pPPI_FRAME =60,现象一样,第1行到第240行的数据能在某个时刻某个位置显示出来,只是不能按顺序拼成完整的一帧。
「该帖子被 bh99 在 2013-05-04 00:16:37 编辑过」