//设置图像输出窗口
//对QVGA设置。
void OV7670_Window_Set(u16 sx,u16 sy,u16 width,u16 height)
{
u16 endx;
u16 endy;
u8 temp;
endx=sx+width*2; //V*2
endy=sy+height*2;
if(endy>784)endy-=784;
temp=SCCB_RD_Reg(0X03); //读取Vref之前的值
temp&=0XF0;
temp|=((endx&0X03)<<2)|(sx&0X03);
SCCB_WR_Reg(0X03,temp); //设置Vref的start和end的最低2位
SCCB_WR_Reg(0X19,sx>>2); //设置Vref的start高8位
SCCB_WR_Reg(0X1A,endx>>2); //设置Vref的end的高8位
temp=SCCB_RD_Reg(0X32); //读取Href之前的值
temp&=0XC0;
temp|=((endy&0X07)<<3)|(sy&0X07);
SCCB_WR_Reg(0X17,sy>>3); //设置Href的start高8位
SCCB_WR_Reg(0X18,endy>>3); //设置Href的end的高8位
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
原子哥,我在这个例程的test.c里 注销了OV7670_Windows_Set()这个函数,刷到mini板后,图像输出仍然正常,感觉它完全可以不要啊,另外,那个10--HSTART 174-VSTART,太费解了,10和174到底是指的啥?和这个摄像头的图像传感器(大小是656x488像素)的大小是什么关系? 另外,如果我自己要去调用这个函数,修改窗口(这个窗口指的是图像传感器上的一个区域吗?),前两个参数从哪儿来呢?
---------------------------------
那是因为初始化序列里面,有窗口设置的部分,你可以看看我们的初始化寄存器列表,就知道了。
至于参数关系,我也不知道怎么来的,抄别人的,别人貌似是从linux代码移植过来的。
这样,只能你去问OV公司才可以知道为甚了。。。
搞懂了顺便告诉我下,谢谢。
1.首先是这段代码的含义,这段代码来自OV7670摄像头的实验例程,含义是为了设置窗口,输入图像的行起始点,场起始点,宽度,高度,可以图片分辨率缩小,以减少数据量来适应数据的传输。
2.下面是主要的寄存器:
0x17HSTART 输出格式-行频开始高八位(低三位在HREF[2:0])
0x18HSTOP 输出格式-行频结束高八位(低三位在HREF[5:3])
0x19VSTRT 输出格式-场频开始高八位(低二位在VREF[1:0])
0x1AVSTOP 输出格式-场频结束高八位(低二位在VREF[3:2])
0x03VREF 位[3:2]VREF结束的低两位(高八位见VSTOP[7:0]
位[1:0]VREF开始的低两位(高八位见VSTOP[7:0]
0x32HREF 读写HREF控制
位[5:3]:HREF结束的低3位(高8位在HSTOP)
设置方式是这样的:QVGA RGB565 320*240
{0x32,0x80},
{0x17,0x17},
{0x18,0x05},
{0x19,0x02},
{0x1a,0x7b},
{0x03,0x0a},
先把这几个寄存器的值计算一下可以发现设置是这样的:
HSTART=184 HSTOP=40 VSTART=11 VSTOP=492
先看HREF,右图
程序中,height*2 是因为每个像素点是有两个数据
HSTOP=START+HREF,而HSTOP是40,184+320*2=824,而不是824,40 怎么来,是824%784得到的,784如图所示:
HREF:784*tP=640*tP+144*tP
至于endx=sx+width*2;同样上图:如下
可以看出来VSTART VSTOP这两个寄存器决定了采集的行数也就是高度
VSTART=HEIGHT*2+VSTOP;
这样就是该代码的含义吧。也不知道和编写者的想法是不是一致的,请大神指点,纠错。
下面我上的自己改的参数的图片来说明这一点,其他参数的时候会导致屏切割,我还没找到原因……
大家可以看到区别的
一周热门 更多>