回复【3楼】 zq175175 :
---------------------------------
可以的
exti.c里面,EXTI9_5_IRQHandler函数改为:
[mw_shl_code=c,true]u8 ov_sta; //帧中断标记
//外部中断5~9服务程序
void EXTI9_5_IRQHandler(void)
{
if(EXTI->  R&(1<<8)) //是8线的中断
{
if(ov_sta==0)
{
OV7670_WRST=0; //复位写指针
OV7670_RCK_L;
OV7670_RCK_H;
OV7670_WRST=1;
OV7670_WREN=1; //允许写入FIFO
ov_sta++; //帧中断加1
}else OV7670_WREN=0;//禁止写入FIFO
}
EXTI->  R=1<<8; //清除LINE8上的中断标志位
} [/mw_shl_code]
main.c,camera_refresh函数改为:
[mw_shl_code=c,true]//更新LCD显示
void camera_refresh(void)
{
u32 j;
u16 color;
if(ov_sta)//有帧中断更新?
{
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); //恢复默认扫描方向
}
}[/mw_shl_code]
ov7670.h里面,修改SCK的设置方式,为快速IO,如下:
[mw_shl_code=c,true]#define OV7670_VSYNC PAin(8) //同步信号检测IO
#define OV7670_WRST PDout(6) //写指针复位
#define OV7670_WREN PBout(3) //写入FIFO使能
#define OV7670_RCK_H GPIOB->BSRR=1<<4//设置读数据时钟高电平
#define OV7670_RCK_L GPIOB->BRR=1<<4 //设置读数据时钟低电平
#define OV7670_RRST PGout(14) //读指针复位
#define OV7670_CS PGout(15) //片选信号(OE)
[/mw_shl_code]
然后,编译器优化等级选择-O2,就可以达到30帧 |