标题:
OV7670在stm32上实现颜色跟踪 EasyTrace演示工程
[打印本页]
作者:
51黑电子迷
时间:
2017-8-11 03:41
标题:
OV7670在stm32上实现颜色跟踪 EasyTrace演示工程
EasyTrace演示工程
0.png
(37.78 KB, 下载次数: 88)
下载附件
2017-8-11 03:41 上传
stm32单片机实现颜色跟踪源程序如下:
//注:此文件代码由王工提供
#include "Sensor.h"
#include "sccb.h"
const char OV7670_reg[OV7670_REG_NUM][2]=
{
/*以下为OV7670 QVGA RGB565参数 */
{0x3a, 0x04},
{0x40, 0x10},
{0x12, 0x14},
{0x32, 0x80},
{0x17, 0x16},
{0x18, 0x04},//5
{0x19, 0x02},
{0x1a, 0x7b},//0x7a,
{0x03, 0x06},//0x0a,
{0x0c, 0x0c},
{0x15, 0x02},
{0x3e, 0x00},//10
{0x70, 0x00},
{0x71, 0x01},
{0x72, 0x11},
{0x73, 0x09},//
{0xa2, 0x02},//15
{0x11, 0x00},
{0x7a, 0x20},
{0x7b, 0x1c},
{0x7c, 0x28},
{0x7d, 0x3c},//20
{0x7e, 0x55},
{0x7f, 0x68},
{0x80, 0x76},
{0x81, 0x80},
{0x82, 0x88},
{0x83, 0x8f},
{0x84, 0x96},
{0x85, 0xa3},
{0x86, 0xaf},
{0x87, 0xc4},//30
{0x88, 0xd7},
{0x89, 0xe8},
{0x13, 0xe0},
{0x00, 0x00},//AGC
{0x10, 0x00},
{0x0d, 0x00},
{0x14, 0x30},//0x38, limit the max gain
{0xa5, 0x05},
{0xab, 0x07},
{0x24, 0x75},//40
{0x25, 0x63},
{0x26, 0xA5},
{0x9f, 0x78},
{0xa0, 0x68},
{0xa1, 0x03},//0x0b,
{0xa6, 0xdf},//0xd8,
{0xa7, 0xdf},//0xd8,
{0xa8, 0xf0},
{0xa9, 0x90},
{0xaa, 0x94},//50
{0x13, 0xe5},
{0x0e, 0x61},
{0x0f, 0x4b},
{0x16, 0x02},
{0x1e, 0x07},//0x07,
{0x21, 0x02},
{0x22, 0x91},
{0x29, 0x07},
{0x33, 0x0b},
{0x35, 0x0b},//60
{0x37, 0x1d},
{0x38, 0x71},
{0x39, 0x2a},
{0x3c, 0x78},
{0x4d, 0x40},
{0x4e, 0x20},
{0x69, 0x5d},
{0x6b, 0x40},//PLL
{0x74, 0x19},
{0x8d, 0x4f},
{0x8e, 0x00},//70
{0x8f, 0x00},
{0x90, 0x00},
{0x91, 0x00},
{0x92, 0x00},//0x19,//0x66
{0x96, 0x00},
{0x9a, 0x80},
{0xb0, 0x84},
{0xb1, 0x0c},
{0xb2, 0x0e},
{0xb3, 0x82},//80
{0xb8, 0x0a},
{0x43, 0x14},
{0x44, 0xf0},
{0x45, 0x34},
{0x46, 0x58},
{0x47, 0x28},
{0x48, 0x3a},
{0x59, 0x88},
{0x5a, 0x88},
{0x5b, 0x44},//90
{0x5c, 0x67},
{0x5d, 0x49},
{0x5e, 0x0e},
{0x64, 0x04},
{0x65, 0x20},
{0x66, 0x05},
{0x94, 0x04},
{0x95, 0x08},
{0x6c, 0x0a},
{0x6d, 0x55},
{0x4f, 0x80},
{0x50, 0x80},
{0x51, 0x00},
{0x52, 0x22},
{0x53, 0x5e},
{0x54, 0x80},
{0x6e, 0x11},//100
{0x6f, 0x9f},//0x9e for advance AWB
{0x55, 0x00},//亮度
{0x56, 0x45},//对比度
{0x57, 0x80},//0x40, change according to Jim's request
};
extern const char OV7670_reg[OV7670_REG_NUM][2];
static void delay_us(unsigned long i)
{
while( i--);
}
void Sensor_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable GPIOC clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = Sensor_VSYNC_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;////上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//////////////////////////////////////////////////
////函数功能:中断配制
//guanfu_wang
void Sensor_Interrupts_Config(void)//VSYNC 中断
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the EXTI9_5 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
////////////////////////////////////////////////////////////////////////
void Sensor_EXTI_Config(void)//VSYNC 中断
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PORT_SOURCE_VSYNC_CMOS, GPIO_PIN_SOURCE_VSYNC_CMOS);
EXTI_InitStructure.EXTI_Line = EXTI_LINE_VSYNC_CMOS;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_GenerateSWInterrupt(EXTI_LINE_VSYNC_CMOS);
}
///////////////////////////////////////////////////////////////////////////
//功能:写OV7660寄存器
//返回:1-成功 0-失败
//guanfu_wang
unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
{
startSCCB();//发送SCCB 总线开始传输命令
if(0==SCCBwriteByte(0x42))//写地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
if(0==SCCBwriteByte(regID))//积存器ID
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
if(0==SCCBwriteByte(regDat))//写数据到积存器
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
stopSCCB();//发送SCCB 总线停止传输命令
return(1);//成功返回
}
////////////////////////////
//功能:读OV7660寄存器
//返回:1-成功 0-失败
//guanfu_wang
unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
{
//通过写操作设置寄存器地址
startSCCB();
if(0==SCCBwriteByte(0x42))//写地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
if(0==SCCBwriteByte(regID))//积存器ID
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
stopSCCB();//发送SCCB 总线停止传输命令
delay_us(20);
//设置寄存器地址后,才是读
startSCCB();
if(0==SCCBwriteByte(0x43))//读地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(20);
*regDat=SCCBreadByte();//返回读到的值
noAck();//发送NACK命令
stopSCCB();//发送SCCB 总线停止传输命令
return(1);//成功返回
}
/* Sensor_init() */
//返回1成功,返回0失败
//guanfu_wang
unsigned char Sensor_init(void)
{
unsigned char temp;
unsigned int i=0;
// XCLK_init_ON();//开启MCO功能 提供时钟给CMOS传感器
//uchar ovidmsb=0,ovidlsb=0;
Sensor_GPIO_Init();
SCCB_GPIO_Config();//io init..
temp=0x80;
if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
{
return 0 ;//错误返回
}
delay_us(10000);
if(0==rd_Sensor_Reg(0x0b, &temp))//读ID
{
return 0 ;//错误返回
}
if(temp==0x73)//OV7670
{
for(i=0;i<OV7670_REG_NUM;i++)
{
if( 0==wr_Sensor_Reg(OV7670_reg[i][0],OV7670_reg[i][1]))
{
return 0;//错误返回
}
}
Sensor_EXTI_Config();
Sensor_Interrupts_Config();
}
return 0x01; //ok
}
复制代码
所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-92244-1.html
(2楼下载)
作者:
hu9610099
时间:
2018-12-4 23:48
hao好好
作者:
plj213
时间:
2019-4-4 16:39
谢谢分享,,,,,,,,,
作者:
hahaha9958
时间:
2019-12-30 11:28
不错啊,可以移植性很高哦
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1