寄存器设置程序如下:
只列出部分寄存器设置,其他寄存器均为网上摘录的,也就不列出来了
//配置为YUV格式关键寄存器配置
Write_OV7670_REG(0x67, 0xaa); //固定U值 寄存器TSLB[4]=1时有效
Write_OV7670_REG(0x68, 0x55); //固定V值 寄存器TSLB[4]=1时有效
Write_OV7670_REG(0x3a, 0x14); //0x14 YUV输出顺序(由TSLB[3](0x3A)和寄存器COM13[0](0x3D)一起决定)
Write_OV7670_REG(0x40, 0xC0); //输出范围:[00]到[FF],这个寄存器必须设置
Write_OV7670_REG(0x12, 0x10); //QVGA YUV
//分辨率配置
Write_OV7670_REG(0x32, 0x80); //HREF HREF控制 位[7:6]:HREF沿距数据输出的偏移/位[5:3]:HREF结束的低3位(高8位在HSTOP)
Write_OV7670_REG(0x17, 0x16); //HSTART 输出格式-行频开始高八位(低三位在HREF[2:0])
Write_OV7670_REG(0x18, 0x04); //HSTOP 输出格式-行频结束高八位(低三位在HREF[5:3])
Write_OV7670_REG(0x19, 0x02); //VSTRT 输出格式-场频开始高八位(低二位在VREF[1:0])
Write_OV7670_REG(0x1a, 0x7b); //VSTOP 输出格式-场频结束高八位(低二位在VREF[3:2])
Write_OV7670_REG(0x03, 0x06); //VREF 帧竖直方向控制 位[3:2]VREF 结束的低两位(高八位见VSTOP[7:0]/位[1:0]VREF 开始的低两位(高八位见VSTOP[7:0]
读取图像数据程序如下:
用的是中断法读取,VSYNC接在中断口,触发中断后INT4即变成1
if (INT4)//(~VSYNC & HREF)//用中断也可以,主要就是要检测到VSYNC的电平信号,VSYNC和HREF/HSYNC其实可以接到同个IO口
{
INT4 = 0;
Vsync_Flag++;
if (Vsync_Flag == 1) //Vsync_Flag=1:VSYNC第一次到来,先复位一下写指针,目前正在往FIFO里面写数据
{
FIFO_WRST = 1;
FIFO_WRST = 0; //复位写指针
MicroWait(100);
FIFO_WRST = 1;
FIFO_WR = 1; //允许写入FIFO
}
if (Vsync_Flag == 2) //Vsync_Flag=2:VSYNC第二次到来,表明一帧数据存储完毕,此时我们设置WREN为0,禁止再往FIFO写入数据
{
HAL_DISABLE_INTERRUPTS(); //禁止中断,准备读取数据
FIFO_WR = 0; //禁止写入FIFO
FIFO_RRST = 0; //复位读指针
FIFO_RCK = 0; //at least one RCK clock is needed to make sure
asm("NOP");
FIFO_RCK = 1;
asm("NOP");
FIFO_RCK = 0;
asm("NOP");
FIFO_RCK = 1;
asm("NOP");
FIFO_RRST = 1;
FIFO_OE=0; //允许FIFO输出
//HAL_Send_Uart0(&fcs,1);//UartSend(&fcs,1); //串口工具发送行起始标志位
//asm("NOP");
for (ik = 0;ik ++ < 320;)//数据量320*240*2 QVGA format,240 lines;320dots every line,153600 8bit data
{
for (iw = 0;iw ++ < 240;)
{
FIFO_RCK = 0;
asm("NOP");
FIFO_RCK = 1;
asm("NOP");
CAM_DH = (0x00ff & DOUT);
FIFO_RCK = 0;
asm("NOP");
FIFO_RCK = 1;
asm("NOP");
CAM_DL = (0x00ff & DOUT);
HAL_Send_Uart0(&CAM_DH,1);//UartSend(&CAM_DH,1);//高位为Y数据
// UartSend(&CAM_DL,1);//低位为U或V,不输出即人为去除
}
}
FIFO_OE = 1; //禁止FIFO输出
FIFO_WR = 0;
Vsync_Flag = 0; //设置为0,则开启下一轮FIFO数据存储
//HAL_ENABLE_INTERRUPTS();
}
} |