新手上路
- 积分
- 36
- 金钱
- 36
- 注册时间
- 2017-3-9
- 在线时间
- 11 小时
|

楼主 |
发表于 2017-4-4 14:26:41
|
显示全部楼层
原子哥,我还有一件事情想问你,就是我因为要发送嘛,所以可能就是很慢的从FIFO读取一帧,因为花了大量时间去发送,于是我就遇到了这样一个问题,就是新的图像一直在写入FIFO,而我上一帧的图像还没有读取完成,下一帧的图像就来了,图像会分层,于是我想了个办法,让它写FIFO 跟我读FIFO 频率同步起来,就是读完了新的一帧,才写入下一帧,我在帧中断函数里加了个标志位(用来判断我是不是已经把上一帧读取完了).
[mw_shl_code=c,true]void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line8)==SET) //是8线的中断
{
if(Readfinish==1)
{
Readfinish=0;
OV7670_WRST=0; //复位写指针
OV7670_WRST=1;
OV7670_WREN=1; //允许写入FIFO
ov_sta++; //帧中断加1
}
}
EXTI_ClearITPendingBit(EXTI_Line8); //清除EXTI8线路挂起位
} [/mw_shl_code]
然后在做测试的时候,我在显示也就是读FIFO 里面去加了个延时让它读得很慢
[mw_shl_code=c,true]//更新LCD显示
void camera_refresh(void)
{
u32 j;
u16 color;
if(ov_sta)//有帧中断更新?
{
delay_ms(1000);
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//将显示区域设置到屏幕中央
else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//将显示区域设置到屏幕中央
LCD_WriteRAM_Prepare(); //开始写入GRAM
OV7670_RRST=0; //开始复位读指针
OV7670_RCK_L;
OV7670_RCK_H;
OV7670_RCK_L;
OV7670_RRST=1; //复位读指针结束
OV7670_RCK_H;
for(j=0;j<76800;j++)
{
OV7670_RCK_L;
color=GPIOC->IDR&0XFF; //读数据
OV7670_RCK_H;
color<<=8;
OV7670_RCK_L;
color|=GPIOC->IDR&0XFF; //读数据
OV7670_RCK_H;
LCD->LCD_RAM=color;
}
ov_sta=0; //清零帧中断标记
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
Readfinish=1; //读完成标志置一
}
}
[/mw_shl_code]
最后,发现,图像分成了分层,也就是两块,有点懵逼呀,原子哥,求解答. |
|