Update ov2640.c
This commit is contained in:
@@ -6,11 +6,22 @@
|
|||||||
#include "usart.h"
|
#include "usart.h"
|
||||||
#include "sccb.h"
|
#include "sccb.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
//<2F><>ʼ<EFBFBD><CABC>OV2640
|
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>,Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1600*1200<30>ߴ<EFBFBD><DFB4><EFBFBD>ͼƬ!!
|
//ALIENTEK STM32F103开发板
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
//OV2640 驱动代码
|
||||||
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//正点原子@ALIENTEK
|
||||||
|
//技术论坛:www.openedv.com
|
||||||
|
//创建日期:2015/4/16
|
||||||
|
//版本:V1.0
|
||||||
|
//版权所有,盗版必究。
|
||||||
|
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
|
||||||
|
//All rights reserved
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//初始化OV2640
|
||||||
|
//配置完以后,默认输出是1600*1200尺寸的图片!!
|
||||||
|
//返回值:0,成功
|
||||||
|
// 其他,错误代码
|
||||||
void OV2640_PWDN(uint8_t signal)
|
void OV2640_PWDN(uint8_t signal)
|
||||||
{
|
{
|
||||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, (GPIO_PinState)signal);
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, (GPIO_PinState)signal);
|
||||||
@@ -25,38 +36,38 @@ uint8_t OV2640_Init(void)
|
|||||||
{
|
{
|
||||||
uint16_t i=0;
|
uint16_t i=0;
|
||||||
uint16_t reg;
|
uint16_t reg;
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO
|
//设置IO
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
__HAL_RCC_GPIOG_CLK_ENABLE(); //ʹ<EFBFBD><EFBFBD>GPIOBʱ<EFBFBD><EFBFBD>
|
__HAL_RCC_GPIOG_CLK_ENABLE(); //使能GPIOB时钟
|
||||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13|GPIO_PIN_15, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13|GPIO_PIN_15, GPIO_PIN_RESET);
|
||||||
//GPIOF9,F10<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//GPIOF9,F10初始化设置
|
||||||
GPIO_InitStructure.Pin = GPIO_PIN_13|GPIO_PIN_15;
|
GPIO_InitStructure.Pin = GPIO_PIN_13|GPIO_PIN_15;
|
||||||
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
|
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
|
GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
|
||||||
GPIO_InitStructure.Pull = GPIO_PULLUP;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
GPIO_InitStructure.Pull = GPIO_PULLUP;//上拉
|
||||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);//<EFBFBD><EFBFBD>ʼ<EFBFBD>
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);//初始<EFBFBD>
|
||||||
|
|
||||||
OV2640_PWDN(0); //POWER ON
|
OV2640_PWDN(0); //POWER ON
|
||||||
delay_ms(10);
|
delay_ms(10);
|
||||||
OV2640_RST(0); //<EFBFBD><EFBFBD>λOV2640
|
OV2640_RST(0); //复位OV2640
|
||||||
delay_ms(10);
|
delay_ms(10);
|
||||||
OV2640_RST(1); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
OV2640_RST(1); //结束复位
|
||||||
SCCB_Init(); //<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>SCCB <20><>IO<49><4F>
|
SCCB_Init(); //初始化SCCB 的IO口
|
||||||
SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>sensor<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
|
SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01); //操作sensor寄存器
|
||||||
SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λOV2640
|
SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80); //软复位OV2640
|
||||||
delay_ms(50);
|
delay_ms(50);
|
||||||
reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH); //<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID <20>߰<EFBFBD>λ
|
reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH); //读取厂家ID 高八位
|
||||||
reg<<=8;
|
reg<<=8;
|
||||||
reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL); //<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID <20>Ͱ<EFBFBD>λ
|
reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL); //读取厂家ID 低八位
|
||||||
printf("OV2640_MID = %#X\n" , reg);
|
printf("OV2640_MID = %#X\n" , reg);
|
||||||
if(reg!=OV2640_MID)
|
if(reg!=OV2640_MID)
|
||||||
{
|
{
|
||||||
printf("MID:%d\r\n",reg);
|
printf("MID:%d\r\n",reg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH); //<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID <20>߰<EFBFBD>λ
|
reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH); //读取厂家ID 高八位
|
||||||
reg<<=8;
|
reg<<=8;
|
||||||
reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL); //<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID <20>Ͱ<EFBFBD>λ
|
reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL); //读取厂家ID 低八位
|
||||||
if(reg!=OV2640_PID)
|
if(reg!=OV2640_PID)
|
||||||
{
|
{
|
||||||
printf("HID:%d\r\n",reg);
|
printf("HID:%d\r\n",reg);
|
||||||
@@ -69,34 +80,34 @@ uint8_t OV2640_Init(void)
|
|||||||
printf("OV2640_init SUCCESS\n");
|
printf("OV2640_init SUCCESS\n");
|
||||||
return 0x00; //ok
|
return 0x00; //ok
|
||||||
}
|
}
|
||||||
//OV2640<EFBFBD>л<EFBFBD>ΪJPEGģʽ
|
//OV2640切换为JPEG模式
|
||||||
void OV2640_JPEG_Mode(void)
|
void OV2640_JPEG_Mode(void)
|
||||||
{
|
{
|
||||||
uint16_t i=0;
|
uint16_t i=0;
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:YUV422<EFBFBD><EFBFBD>ʽ
|
//设置:YUV422格式
|
||||||
for(i=0;i<(sizeof(ov2640_yuv422_reg_tbl)/2);i++)
|
for(i=0;i<(sizeof(ov2640_yuv422_reg_tbl)/2);i++)
|
||||||
{
|
{
|
||||||
SCCB_WR_Reg(ov2640_yuv422_reg_tbl[i][0],ov2640_yuv422_reg_tbl[i][1]);
|
SCCB_WR_Reg(ov2640_yuv422_reg_tbl[i][0],ov2640_yuv422_reg_tbl[i][1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>JPEG<45><47><EFBFBD><EFBFBD>
|
//设置:输出JPEG数据
|
||||||
for(i=0;i<(sizeof(ov2640_jpeg_reg_tbl)/2);i++)
|
for(i=0;i<(sizeof(ov2640_jpeg_reg_tbl)/2);i++)
|
||||||
{
|
{
|
||||||
SCCB_WR_Reg(ov2640_jpeg_reg_tbl[i][0],ov2640_jpeg_reg_tbl[i][1]);
|
SCCB_WR_Reg(ov2640_jpeg_reg_tbl[i][0],ov2640_jpeg_reg_tbl[i][1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//OV2640<EFBFBD>л<EFBFBD>ΪRGB565ģʽ
|
//OV2640切换为RGB565模式
|
||||||
void OV2640_RGB565_Mode(void)
|
void OV2640_RGB565_Mode(void)
|
||||||
{
|
{
|
||||||
uint16_t i=0;
|
uint16_t i=0;
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:RGB565<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//设置:RGB565输出
|
||||||
for(i=0;i<(sizeof(ov2640_rgb565_reg_tbl)/2);i++)
|
for(i=0;i<(sizeof(ov2640_rgb565_reg_tbl)/2);i++)
|
||||||
{
|
{
|
||||||
SCCB_WR_Reg(ov2640_rgb565_reg_tbl[i][0],ov2640_rgb565_reg_tbl[i][1]);
|
SCCB_WR_Reg(ov2640_rgb565_reg_tbl[i][0],ov2640_rgb565_reg_tbl[i][1]);
|
||||||
}
|
}
|
||||||
printf("OV2640_RGB565 SET!\n");
|
printf("OV2640_RGB565 SET!\n");
|
||||||
}
|
}
|
||||||
//<EFBFBD>Զ<EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,֧<><D6A7>5<EFBFBD><35><EFBFBD>ȼ<EFBFBD>
|
//自动曝光设置参数表,支持5个等级
|
||||||
const static uint8_t OV2640_AUTOEXPOSURE_LEVEL[5][8]=
|
const static uint8_t OV2640_AUTOEXPOSURE_LEVEL[5][8]=
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -130,7 +141,7 @@ const static uint8_t OV2640_AUTOEXPOSURE_LEVEL[5][8]=
|
|||||||
0x26,0x92,
|
0x26,0x92,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
//OV2640<EFBFBD>Զ<EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//OV2640自动曝光等级设置
|
||||||
//level:0~4
|
//level:0~4
|
||||||
void OV2640_Auto_Exposure(uint8_t level)
|
void OV2640_Auto_Exposure(uint8_t level)
|
||||||
{
|
{
|
||||||
@@ -141,12 +152,12 @@ void OV2640_Auto_Exposure(uint8_t level)
|
|||||||
SCCB_WR_Reg(p[i*2],p[i*2+1]);
|
SCCB_WR_Reg(p[i*2],p[i*2+1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//<EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//白平衡设置
|
||||||
//0:<EFBFBD>Զ<EFBFBD>
|
//0:自动
|
||||||
//1:̫<EFBFBD><EFBFBD>sunny
|
//1:太阳sunny
|
||||||
//2,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>cloudy
|
//2,阴天cloudy
|
||||||
//3,<EFBFBD>칫<EFBFBD><EFBFBD>office
|
//3,办公室office
|
||||||
//4,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>home
|
//4,家里home
|
||||||
void OV2640_Light_Mode(uint8_t mode)
|
void OV2640_Light_Mode(uint8_t mode)
|
||||||
{
|
{
|
||||||
uint8_t regccval=0X5E;//Sunny
|
uint8_t regccval=0X5E;//Sunny
|
||||||
@@ -180,7 +191,7 @@ void OV2640_Light_Mode(uint8_t mode)
|
|||||||
SCCB_WR_Reg(0XCD,regcdval);
|
SCCB_WR_Reg(0XCD,regcdval);
|
||||||
SCCB_WR_Reg(0XCE,regceval);
|
SCCB_WR_Reg(0XCE,regceval);
|
||||||
}
|
}
|
||||||
//ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//色度设置
|
||||||
//0:-2
|
//0:-2
|
||||||
//1:-1
|
//1:-1
|
||||||
//2,0
|
//2,0
|
||||||
@@ -196,7 +207,7 @@ void OV2640_Color_Saturation(uint8_t sat)
|
|||||||
SCCB_WR_Reg(0X7D,reg7dval);
|
SCCB_WR_Reg(0X7D,reg7dval);
|
||||||
SCCB_WR_Reg(0X7D,reg7dval);
|
SCCB_WR_Reg(0X7D,reg7dval);
|
||||||
}
|
}
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//亮度设置
|
||||||
//0:(0X00)-2
|
//0:(0X00)-2
|
||||||
//1:(0X10)-1
|
//1:(0X10)-1
|
||||||
//2,(0X20) 0
|
//2,(0X20) 0
|
||||||
@@ -211,7 +222,7 @@ void OV2640_Brightness(uint8_t bright)
|
|||||||
SCCB_WR_Reg(0x7d, bright<<4);
|
SCCB_WR_Reg(0x7d, bright<<4);
|
||||||
SCCB_WR_Reg(0x7d, 0x00);
|
SCCB_WR_Reg(0x7d, 0x00);
|
||||||
}
|
}
|
||||||
//<EFBFBD>Աȶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//对比度设置
|
||||||
//0:-2
|
//0:-2
|
||||||
//1:-1
|
//1:-1
|
||||||
//2,0
|
//2,0
|
||||||
@@ -219,7 +230,7 @@ void OV2640_Brightness(uint8_t bright)
|
|||||||
//4,+2
|
//4,+2
|
||||||
void OV2640_Contrast(uint8_t contrast)
|
void OV2640_Contrast(uint8_t contrast)
|
||||||
{
|
{
|
||||||
uint8_t reg7d0val=0X20;//Ĭ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ͨģʽ
|
uint8_t reg7d0val=0X20;//默认为普通模式
|
||||||
uint8_t reg7d1val=0X20;
|
uint8_t reg7d1val=0X20;
|
||||||
switch(contrast)
|
switch(contrast)
|
||||||
{
|
{
|
||||||
@@ -249,43 +260,43 @@ void OV2640_Contrast(uint8_t contrast)
|
|||||||
SCCB_WR_Reg(0x7d,reg7d1val);
|
SCCB_WR_Reg(0x7d,reg7d1val);
|
||||||
SCCB_WR_Reg(0x7d,0x06);
|
SCCB_WR_Reg(0x7d,0x06);
|
||||||
}
|
}
|
||||||
//<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//特效设置
|
||||||
//0:<EFBFBD><EFBFBD>ͨģʽ
|
//0:普通模式
|
||||||
//1,<EFBFBD><EFBFBD>Ƭ
|
//1,负片
|
||||||
//2,<EFBFBD>ڰ<EFBFBD>
|
//2,黑白
|
||||||
//3,ƫ<EFBFBD><EFBFBD>ɫ
|
//3,偏红色
|
||||||
//4,ƫ<EFBFBD><EFBFBD>ɫ
|
//4,偏绿色
|
||||||
//5,ƫ<EFBFBD><EFBFBD>ɫ
|
//5,偏蓝色
|
||||||
//6,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//6,复古
|
||||||
void OV2640_Special_Effects(uint8_t eft)
|
void OV2640_Special_Effects(uint8_t eft)
|
||||||
{
|
{
|
||||||
uint8_t reg7d0val=0X00;//Ĭ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ͨģʽ
|
uint8_t reg7d0val=0X00;//默认为普通模式
|
||||||
uint8_t reg7d1val=0X80;
|
uint8_t reg7d1val=0X80;
|
||||||
uint8_t reg7d2val=0X80;
|
uint8_t reg7d2val=0X80;
|
||||||
switch(eft)
|
switch(eft)
|
||||||
{
|
{
|
||||||
case 1://<EFBFBD><EFBFBD>Ƭ
|
case 1://负片
|
||||||
reg7d0val=0X40;
|
reg7d0val=0X40;
|
||||||
break;
|
break;
|
||||||
case 2://<EFBFBD>ڰ<EFBFBD>
|
case 2://黑白
|
||||||
reg7d0val=0X18;
|
reg7d0val=0X18;
|
||||||
break;
|
break;
|
||||||
case 3://ƫ<EFBFBD><EFBFBD>ɫ
|
case 3://偏红色
|
||||||
reg7d0val=0X18;
|
reg7d0val=0X18;
|
||||||
reg7d1val=0X40;
|
reg7d1val=0X40;
|
||||||
reg7d2val=0XC0;
|
reg7d2val=0XC0;
|
||||||
break;
|
break;
|
||||||
case 4://ƫ<EFBFBD><EFBFBD>ɫ
|
case 4://偏绿色
|
||||||
reg7d0val=0X18;
|
reg7d0val=0X18;
|
||||||
reg7d1val=0X40;
|
reg7d1val=0X40;
|
||||||
reg7d2val=0X40;
|
reg7d2val=0X40;
|
||||||
break;
|
break;
|
||||||
case 5://ƫ<EFBFBD><EFBFBD>ɫ
|
case 5://偏蓝色
|
||||||
reg7d0val=0X18;
|
reg7d0val=0X18;
|
||||||
reg7d1val=0XA0;
|
reg7d1val=0XA0;
|
||||||
reg7d2val=0X40;
|
reg7d2val=0X40;
|
||||||
break;
|
break;
|
||||||
case 6://<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
case 6://复古
|
||||||
reg7d0val=0X18;
|
reg7d0val=0X18;
|
||||||
reg7d1val=0X40;
|
reg7d1val=0X40;
|
||||||
reg7d2val=0XA6;
|
reg7d2val=0XA6;
|
||||||
@@ -298,9 +309,9 @@ void OV2640_Special_Effects(uint8_t eft)
|
|||||||
SCCB_WR_Reg(0x7d,reg7d1val);
|
SCCB_WR_Reg(0x7d,reg7d1val);
|
||||||
SCCB_WR_Reg(0x7d,reg7d2val);
|
SCCB_WR_Reg(0x7d,reg7d2val);
|
||||||
}
|
}
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//彩条测试
|
||||||
//sw:0,<EFBFBD>رղ<EFBFBD><EFBFBD><EFBFBD>
|
//sw:0,关闭彩条
|
||||||
// 1,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ע<><D7A2>OV2640<34>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
// 1,开启彩条(注意OV2640的彩条是叠加在图像上面的)
|
||||||
void OV2640_Color_Bar(uint8_t sw)
|
void OV2640_Color_Bar(uint8_t sw)
|
||||||
{
|
{
|
||||||
uint8_t reg;
|
uint8_t reg;
|
||||||
@@ -310,9 +321,9 @@ void OV2640_Color_Bar(uint8_t sw)
|
|||||||
if(sw)reg|=1<<1;
|
if(sw)reg|=1<<1;
|
||||||
SCCB_WR_Reg(0X12,reg);
|
SCCB_WR_Reg(0X12,reg);
|
||||||
}
|
}
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//设置图像输出窗口
|
||||||
//sx,sy,<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
|
//sx,sy,起始地址
|
||||||
//width,height:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>Ӧ:horizontal)<EFBFBD>߶<EFBFBD>(<28><>Ӧ:vertical)
|
//width,height:宽度(对应:horizontal)和高度(对应:vertical)
|
||||||
void OV2640_Window_Set(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height)
|
void OV2640_Window_Set(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height)
|
||||||
{
|
{
|
||||||
uint16_t endx;
|
uint16_t endx;
|
||||||
@@ -322,25 +333,25 @@ void OV2640_Window_Set(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height)
|
|||||||
endy=sy+height/2;
|
endy=sy+height/2;
|
||||||
|
|
||||||
SCCB_WR_Reg(0XFF,0X01);
|
SCCB_WR_Reg(0XFF,0X01);
|
||||||
temp=SCCB_RD_Reg(0X03); //<EFBFBD><EFBFBD>ȡVref֮ǰ<EFBFBD><EFBFBD>ֵ
|
temp=SCCB_RD_Reg(0X03); //读取Vref之前的值
|
||||||
temp&=0XF0;
|
temp&=0XF0;
|
||||||
temp|=((endy&0X03)<<2)|(sy&0X03);
|
temp|=((endy&0X03)<<2)|(sy&0X03);
|
||||||
SCCB_WR_Reg(0X03,temp); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Vref<EFBFBD><EFBFBD>start<EFBFBD><EFBFBD>end<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2λ
|
SCCB_WR_Reg(0X03,temp); //设置Vref的start和end的最低2位
|
||||||
SCCB_WR_Reg(0X19,sy>>2); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Vref<EFBFBD><EFBFBD>start<EFBFBD><EFBFBD>8λ
|
SCCB_WR_Reg(0X19,sy>>2); //设置Vref的start高8位
|
||||||
SCCB_WR_Reg(0X1A,endy>>2); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Vref<EFBFBD><EFBFBD>end<EFBFBD>ĸ<EFBFBD>8λ
|
SCCB_WR_Reg(0X1A,endy>>2); //设置Vref的end的高8位
|
||||||
|
|
||||||
temp=SCCB_RD_Reg(0X32); //<EFBFBD><EFBFBD>ȡHref֮ǰ<EFBFBD><EFBFBD>ֵ
|
temp=SCCB_RD_Reg(0X32); //读取Href之前的值
|
||||||
temp&=0XC0;
|
temp&=0XC0;
|
||||||
temp|=((endx&0X07)<<3)|(sx&0X07);
|
temp|=((endx&0X07)<<3)|(sx&0X07);
|
||||||
SCCB_WR_Reg(0X32,temp); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Href<EFBFBD><EFBFBD>start<EFBFBD><EFBFBD>end<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3λ
|
SCCB_WR_Reg(0X32,temp); //设置Href的start和end的最低3位
|
||||||
SCCB_WR_Reg(0X17,sx>>3); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Href<EFBFBD><EFBFBD>start<EFBFBD><EFBFBD>8λ
|
SCCB_WR_Reg(0X17,sx>>3); //设置Href的start高8位
|
||||||
SCCB_WR_Reg(0X18,endx>>3); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Href<EFBFBD><EFBFBD>end<EFBFBD>ĸ<EFBFBD>8λ
|
SCCB_WR_Reg(0X18,endx>>3); //设置Href的end的高8位
|
||||||
}
|
}
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
//设置图像输出大小
|
||||||
//OV2640<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С(<28>ֱ<EFBFBD><D6B1><EFBFBD>),<2C><>ȫ<EFBFBD>ɸĺ<C9B8><C4BA><EFBFBD>ȷ<EFBFBD><C8B7>
|
//OV2640输出图像的大小(分辨率),完全由改函数确定
|
||||||
//width,height:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>Ӧ:horizontal)<EFBFBD>߶<EFBFBD>(<28><>Ӧ:vertical),width<EFBFBD><EFBFBD>height<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>
|
//width,height:宽度(对应:horizontal)和高度(对应:vertical),width和height必须是4的倍数
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD>óɹ<C3B3>
|
//返回值:0,设置成功
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
// 其他,设置失败
|
||||||
uint8_t OV2640_OutSize_Set(uint16_t width,uint16_t height)
|
uint8_t OV2640_OutSize_Set(uint16_t width,uint16_t height)
|
||||||
{
|
{
|
||||||
uint16_t outh;
|
uint16_t outh;
|
||||||
@@ -352,23 +363,23 @@ uint8_t OV2640_OutSize_Set(uint16_t width,uint16_t height)
|
|||||||
outh=height/4;
|
outh=height/4;
|
||||||
SCCB_WR_Reg(0XFF,0X00);
|
SCCB_WR_Reg(0XFF,0X00);
|
||||||
SCCB_WR_Reg(0XE0,0X04);
|
SCCB_WR_Reg(0XE0,0X04);
|
||||||
SCCB_WR_Reg(0X5A,outw&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>OUTW<EFBFBD>ĵͰ<EFBFBD>λ
|
SCCB_WR_Reg(0X5A,outw&0XFF); //设置OUTW的低八位
|
||||||
SCCB_WR_Reg(0X5B,outh&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>OUTH<EFBFBD>ĵͰ<EFBFBD>λ
|
SCCB_WR_Reg(0X5B,outh&0XFF); //设置OUTH的低八位
|
||||||
temp=(outw>>8)&0X03;
|
temp=(outw>>8)&0X03;
|
||||||
temp|=(outh>>6)&0X04;
|
temp|=(outh>>6)&0X04;
|
||||||
SCCB_WR_Reg(0X5C,temp); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>OUTH/OUTW<EFBFBD>ĸ<EFBFBD>λ
|
SCCB_WR_Reg(0X5C,temp); //设置OUTH/OUTW的高位
|
||||||
SCCB_WR_Reg(0XE0,0X00);
|
SCCB_WR_Reg(0XE0,0X00);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
//设置图像开窗大小
|
||||||
//<EFBFBD><EFBFBD>:OV2640_ImageSize_Setȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>ʴӴ<EFBFBD>С.
|
//由:OV2640_ImageSize_Set确定传感器输出分辨率从大小.
|
||||||
//<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>OV2640_OutSize_Set<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//该函数则在这个范围上面进行开窗,用于OV2640_OutSize_Set的输出
|
||||||
//ע<EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ⱥ߶<CDB8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>OV2640_OutSize_Set<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>Ⱥ߶<EFBFBD>
|
//注意:本函数的宽度和高度,必须大于等于OV2640_OutSize_Set函数的宽度和高度
|
||||||
// OV2640_OutSize_Set<EFBFBD><EFBFBD><EFBFBD>õĿ<EFBFBD><EFBFBD>Ⱥ߶<EFBFBD>,<2C><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĿ<C3B5><C4BF>Ⱥ߶<CDB8>,<2C><>DSP
|
// OV2640_OutSize_Set设置的宽度和高度,根据本函数设置的宽度和高度,由DSP
|
||||||
// <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>豸.
|
// 自动计算缩放比例,输出给外部设备.
|
||||||
//width,height:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>Ӧ:horizontal)<EFBFBD>߶<EFBFBD>(<28><>Ӧ:vertical),width<EFBFBD><EFBFBD>height<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>
|
//width,height:宽度(对应:horizontal)和高度(对应:vertical),width和height必须是4的倍数
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD>óɹ<C3B3>
|
//返回值:0,设置成功
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
// 其他,设置失败
|
||||||
uint8_t OV2640_ImageWin_Set(uint16_t offx,uint16_t offy,uint16_t width,uint16_t height)
|
uint8_t OV2640_ImageWin_Set(uint16_t offx,uint16_t offy,uint16_t width,uint16_t height)
|
||||||
{
|
{
|
||||||
uint16_t hsize;
|
uint16_t hsize;
|
||||||
@@ -380,31 +391,31 @@ uint8_t OV2640_ImageWin_Set(uint16_t offx,uint16_t offy,uint16_t width,uint16_t
|
|||||||
vsize=height/4;
|
vsize=height/4;
|
||||||
SCCB_WR_Reg(0XFF,0X00);
|
SCCB_WR_Reg(0XFF,0X00);
|
||||||
SCCB_WR_Reg(0XE0,0X04);
|
SCCB_WR_Reg(0XE0,0X04);
|
||||||
SCCB_WR_Reg(0X51,hsize&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H_SIZE<EFBFBD>ĵͰ<EFBFBD>λ
|
SCCB_WR_Reg(0X51,hsize&0XFF); //设置H_SIZE的低八位
|
||||||
SCCB_WR_Reg(0X52,vsize&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>V_SIZE<EFBFBD>ĵͰ<EFBFBD>λ
|
SCCB_WR_Reg(0X52,vsize&0XFF); //设置V_SIZE的低八位
|
||||||
SCCB_WR_Reg(0X53,offx&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>offx<EFBFBD>ĵͰ<EFBFBD>λ
|
SCCB_WR_Reg(0X53,offx&0XFF); //设置offx的低八位
|
||||||
SCCB_WR_Reg(0X54,offy&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>offy<EFBFBD>ĵͰ<EFBFBD>λ
|
SCCB_WR_Reg(0X54,offy&0XFF); //设置offy的低八位
|
||||||
temp=(vsize>>1)&0X80;
|
temp=(vsize>>1)&0X80;
|
||||||
temp|=(offy>>4)&0X70;
|
temp|=(offy>>4)&0X70;
|
||||||
temp|=(hsize>>5)&0X08;
|
temp|=(hsize>>5)&0X08;
|
||||||
temp|=(offx>>8)&0X07;
|
temp|=(offx>>8)&0X07;
|
||||||
SCCB_WR_Reg(0X55,temp); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H_SIZE/V_SIZE/OFFX,OFFY<EFBFBD>ĸ<EFBFBD>λ
|
SCCB_WR_Reg(0X55,temp); //设置H_SIZE/V_SIZE/OFFX,OFFY的高位
|
||||||
SCCB_WR_Reg(0X57,(hsize>>2)&0X80); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H_SIZE/V_SIZE/OFFX,OFFY<EFBFBD>ĸ<EFBFBD>λ
|
SCCB_WR_Reg(0X57,(hsize>>2)&0X80); //设置H_SIZE/V_SIZE/OFFX,OFFY的高位
|
||||||
SCCB_WR_Reg(0XE0,0X00);
|
SCCB_WR_Reg(0XE0,0X00);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD>С,Ҳ<><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
|
//该函数设置图像尺寸大小,也就是所选格式的输出分辨率
|
||||||
//UXGA:1600*1200,SVGA:800*600,CIF:352*288
|
//UXGA:1600*1200,SVGA:800*600,CIF:352*288
|
||||||
//width,height:ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
//width,height:图像宽度和图像高度
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD>óɹ<C3B3>
|
//返回值:0,设置成功
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
// 其他,设置失败
|
||||||
uint8_t OV2640_ImageSize_Set(uint16_t width,uint16_t height)
|
uint8_t OV2640_ImageSize_Set(uint16_t width,uint16_t height)
|
||||||
{
|
{
|
||||||
uint8_t temp;
|
uint8_t temp;
|
||||||
SCCB_WR_Reg(0XFF,0X00);
|
SCCB_WR_Reg(0XFF,0X00);
|
||||||
SCCB_WR_Reg(0XE0,0X04);
|
SCCB_WR_Reg(0XE0,0X04);
|
||||||
SCCB_WR_Reg(0XC0,(width)>>3&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>HSIZE<EFBFBD><EFBFBD>10:3λ
|
SCCB_WR_Reg(0XC0,(width)>>3&0XFF); //设置HSIZE的10:3位
|
||||||
SCCB_WR_Reg(0XC1,(height)>>3&0XFF); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>VSIZE<EFBFBD><EFBFBD>10:3λ
|
SCCB_WR_Reg(0XC1,(height)>>3&0XFF); //设置VSIZE的10:3位
|
||||||
temp=(width&0X07)<<3;
|
temp=(width&0X07)<<3;
|
||||||
temp|=height&0X07;
|
temp|=height&0X07;
|
||||||
temp|=(width>>4)&0X80;
|
temp|=(width>>4)&0X80;
|
||||||
|
Reference in New Issue
Block a user