嵌入式单片机高级篇(三)Stm32F103+OV2640摄像头

Stm32F103+OV2640摄像头

一、OV2640特点:

(1)高灵敏度、低电压适合嵌入式应用
(2)标准的 SCCB 接口,兼容 IIC 接口
(3)支持 RawRGB、RGB(RGB565/RGB555)、GRB422、YUV(422/420)和 YCbCr(422)输出格式
(4)支持 UXGA、SXGA、SVGA 以及按比例缩小到从 SXGA 到 40*30 的任何尺寸
(5)支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平校准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。
(6)自带嵌入式微处理器

二、功能框图:

在这里插入图片描述

三、OV2640 传感器功能模块:

1.感光整列(Image Array)
OV2640 总共有 16321232 个像素,最大输出尺寸为 UXGA(16001200),即 200W 像素。**
2.模拟信号处理(Analog Processing)
模拟信号处理所有模拟功能,并包括:模拟放大(AMP)、增益控制、通道平衡和平衡控制等。
3.10 位 A/D 转换(A/D)
原始的信号经过模拟放大后,分 G 和 BR 两路进入一个 10 位的 A/D 转换器,A/D 转换器工作频率高达 20M,与像素频率完全同步(转换的频率和帧率有关)。除 A/D 转换器外,该模块还有黑电平校正(BLC)功能。
4.数字信号处理器(DSP)
这个部分控制由原始信号插值到 RGB 信号的过程,并控制一些图像质量:
(1)边缘锐化(二维高通滤波器)
(2)颜色空间转换(原始信号到 RGB 或者 YUV/YCbYCr)
(3)RGB 色彩矩阵以消除串扰
(4)色相和饱和度的控制
(5)黑/白点补偿
(6)降噪
(7) 镜头补偿
(8)可编程的伽玛
(9)十位到八位数据转换
5.输出格式模块(Output Formatter)
该模块按设定优先级控制图像的所有输出数据及其格式。
6.压缩引擎(Compression Engine)
压缩引擎框图如图所示:
在这里插入图片描述7.微处理器(Microcontroller)
OV2640 自带了一个 8 位微处理器,该处理器有 512 字节 SRAM,4KB 的 ROM,它提供一个灵活的主机到控制系统的指令接口,同时也具有细调图像质量的功能。
8.SCCB 接口(SCCB Interface)
SCCB 接口控制图像传感器芯片的运行
9.数字视频接口(Digital Video Port)
OV2640 拥有一个 10 位数字视频接口(支持 8 位接法),其 MSB 和 LSB 可以程序设置先后顺序,OV2640 模块采用默认的 8 位连接方式,如图 1.3 所示:
在这里插入图片描述OV2640 的寄存器通过 SCCB 时序访问并设置
8、开窗设置:
在这里插入图片描述

(1)传感器窗口设置,该功能允许用户设置整个传感器区域(16321220)的感兴趣部分,也就是在传感器里面开窗,开窗范围从 22~1632*1220 都可以设置,不过要求这个窗口必须大于等于随后设置的图像尺寸。
传感器窗口通过:0X03/0X19/0X1A/0X07/0X17/0X18等寄存器设置
程序:

//设置传感器输出窗口 
//sx,sy,起始地址
//width,height:宽度(对应:horizontal)和高度(对应:vertical)
void OV2640_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;
	
	SCCB_WR_Reg(0XFF,0X01);			
	temp=SCCB_RD_Reg(0X03);				//读取Vref之前的值
	temp&=0XF0;
	temp|=((endy&0X03)<<2)|(sy&0X03);
	SCCB_WR_Reg(0X03,temp);				//设置Vref的start和end的最低2位
	SCCB_WR_Reg(0X19,sy>>2);			//设置Vref的start高8位
	SCCB_WR_Reg(0X1A,endy>>2);			//设置Vref的end的高8位
	
	temp=SCCB_RD_Reg(0X32);				//读取Href之前的值
	temp&=0XC0;
	temp|=((endx&0X07)<<3)|(sx&0X07);
	SCCB_WR_Reg(0X32,temp);				//设置Href的start和end的最低3位
	SCCB_WR_Reg(0X17,sx>>3);			//设置Href的start高8位
	SCCB_WR_Reg(0X18,endx>>3);			//设置Href的end的高8位
}

(2)图像尺寸设置,也就是 DSP 输出(最终输出到 LCD 的)图像的最大尺寸,该尺寸要小于等于前面我们传感器窗口设置所设定的窗口尺寸。图像尺寸通过:0XC0/0XC1/0X8C 等寄存器设置。
程序:

//设置图像开窗大小
//由:OV2640_ImageSize_Set确定传感器输出分辨率从大小.
//该函数则在这个范围上面进行开窗,用于OV2640_OutSize_Set的输出
//注意:本函数的宽度和高度,必须大于等于OV2640_OutSize_Set函数的宽度和高度
//     OV2640_OutSize_Set设置的宽度和高度,根据本函数设置的宽度和高度,由DSP
//     自动计算缩放比例,输出给外部设备.
//width,height:宽度(对应:horizontal)和高度(对应:vertical),width和height必须是4的倍数
//返回值:0,设置成功
//    其他,设置失败
u8 OV2640_ImageWin_Set(u16 offx,u16 offy,u16 width,u16 height)
{
   
	u16 hsize;
	u16 vsize;
	u8 temp; 
	if(width%4)return 1;
	if(height%4)return 2;
	hsize=width/4;
	vsize=height/4;
	SCCB_WR_Reg(0XFF,0X00);	
	SCCB_WR_Reg(0XE0,0X04);					
	SCCB_WR_Reg(0X51,hsize&0XFF);		//设置H_SIZE的低八位
	SCCB_WR_Reg(0X52,vsize&0XFF);		//设置V_SIZE的低八位
	SCCB_WR_Reg(0X53,offx&0XFF);		//设置offx的低八位
	SCCB_WR_Reg(0X54,offy&0XFF);		//设置offy的低八位
	temp=(vsize>>1)&0X80;
	temp|=(offy>>4)&0X70;
	temp|=(hsize>>5)&0X08;
	temp|=(offx>>8)&0X07; 
	SCCB_WR_Reg(0X55,temp);				//设置H_SIZE/V_SIZE/OFFX,OFFY的高位
	SCCB_WR_Reg(0X57,(hsize>>2)&0X80);	//设置H_SIZE/V_SIZE/OFFX,OFFY的高位
	SCCB_WR_Reg(0XE0,0X00);	
	return 0;
}

(3)图像窗口设置,这里起始和前面的传感器窗口设置类似,只是这个窗口是在我们前面设置的图像尺寸里面,再一次设置窗口大小,该窗口必须小于等于前面设置的图像尺寸。该窗口设置后的图像范围,将用于输出到外部。图像窗口设置通过:0X51/0X52/0X53/0X54/0X55/0X57 等寄存器设置。
程序:

//该函数设置图像尺寸大小,也就是所选格式的输出分辨率
//UXGA:1600*1200,SVGA:800*600,CIF:352*288
//width,height:图像宽度和图像高度
//返回值:0,设置成功
//    其他,设置失败
u8 OV2640_ImageSize_Set(u16 width,u16 height)
{
    
	u8 temp; 
	SCCB_WR_Reg(0XFF,0X00);			
	SCCB_WR_Reg(0XE0,0X04);			
	SCCB_WR_Reg(0XC0,(width)>>3&0XFF);		//设置HSIZE的10:3位
	SCCB_WR_Reg(0XC1,(height)>>3&0XFF);		//设置VSIZE的10:3位
	temp=(width&0X07)<<3;
	temp|=height&0X07;
	temp|=(width>>4)&0X80; 
	SCCB_WR_Reg(0X8C,temp);	
	SCCB_WR_Reg(0XE0,0X00);				 
	return 0;
}

(4)图像输出大小设置,这是最终输出到外部的图像尺寸。该设置将图像窗口设置所决定的窗口大小,通过内部 DSP 处理,缩放成我们输出到外部的图像大小。该设置将会对图像进行缩放处理,如果设置的图像输出大小不等于图像窗口设置图像大小,那么图像就会被缩放
处理,只有这两者设置一样大的时候,输出比例才是 1:1 的。
程序:

//设置图像输出大小
//OV2640输出图像的大小(分辨率),完全由该函数确定
//width,height:宽度(对应:horizontal)和高度(对应:vertical),width和height必须是4的倍数
//返回值:0,设置成功
//    其他,设置失败
u8 OV2640_OutSize_Set(u16 width,u16 height)
{
   
	u16 outh;
	u16 outw;
	u8 temp; 
	if(width%4)return 1;
	if(height%4)return 2;
	outw=width/4;
	outh=height/4; 
	SCCB_WR_Reg(0XFF,0X00);	
	SCCB_WR_Reg(0XE0,0X04);			
	SCCB_WR_Reg(0X5A,outw&0XFF);		//设置OUTW的低八位
	SCCB_WR_Reg(0X5B,outh&0XFF);		//设置OUTH的低八位
	temp=(outw>>8)&0X03;
	temp|=(outh>>6)&0X04;
	SCCB_WR_Reg(0X5C,temp);				//设置OUTH/OUTW的高位 
	SCCB_WR_Reg(0XE0,0X00);	
	return 0;
}

四、OV2640 的图像数据输出格式:

UXGA,即分辨率位 16001200 的输出格式,类似的还有:SXGA(12801024)、WXGA+(1440900) 、 XVGA(1280960) 、 WXGA(1280800) 、 XGA(1024768) 、SVGA(800600)、VGA(640480)、CIF(352288)、WQVGA(400240)、QCIF(176144)和
QQVGA(160
120)等。
PCLK,即像素时钟,一个 PCLK 时钟,输出一个像素(或半个像素)。
VSYNC,即帧同步信号。
HREF,即行参考信号。
HSYNC,即行同步信号。
OV2640 的图像数据输出(通过 Y[9:0])就是在 PCLK,VSYNC 和 HREF/ HSYNC 的控制下进行的

五、时序图:

1、行时序:
在这里插入图片描述
从上图可以看出,图像数据在 HREF 为高的时候输出,当 HREF 变高后,每一个 PCLK时钟,输出一个 8 位/10 位数据。我们采用 8 位接口,所以每个 PCLK 输出 1 个字节,且在RGB/YUV 输出格式下,每个 tp=2 个 Tpclk,如果是 Raw 格式,则一个 tp=1 个 Tpclk。比如
采用 UXGA 时序,RGB565 格式输出,每 2 个字节组成一个像素的颜色(高低字节顺序可通过 0XDA 寄存器设置),这样每行输出总共有 16002 个 PCLK 周期,输出 16002 个字节。
注意:(1)RGB565 格式输出,每 2 个字节组成一个像素的颜色
(2)HREF 为高电平时,数据开始传输
(3)采用 UXGA 时序,RGB565 格式输出1600像素需要1600
2个字节,也就是需要1600
2 个 PCLK 周期
**
2、帧时序(UXGA 模式):
在这里插入图片描述从上图可看出,1 个 HREF 周期由 1600tp高电平和低电平322tp组成。对于 UXGA模式, tP=2×tPCLK 即一个 tPCLK 对应传输一个字节(RGB565 格式传输一行数据的时间 T=1600×2tPCLK)。
其中322tp 是传输一行数据的间隔时间。当传输了1200个 HREF 周期(1200×tLINE)后刚好完成
一个 VSYNC(帧)数据传输,等 57697 tp 后会产生一个 VSYNC 上升沿表示一帧数据传输完成。
程序中我们就可以根据 VSYNC 上升沿来判断一帧图像数据传输完成。
注意:VSYNC 低电平时数据传输
OV2640 的图像数据格式,一般用 2 种输出方式:RGB565 和 JPEG。
当输出 RGB565 格式数据的时候,时序完全就是上面两幅图介绍的关系。以满足不同需要。而当输出数据是 JPEG 数据的时候,同样也是这种方式输出(所以数据读取方法一模一样),不过 PCLK 数目大大减少了,且不连续,输出的数据是压缩后的 JPEG 数据,输出的 JPEG数据以:0XFF,0XD8 开头,以 0XFF,0XD9 结尾,且在 0XFF,0XD8 之前,或者 0XFF,0XD9
之后,会有不定数量的其他数据存在(一般是 0),这些数据我们直接忽略即可,将得到的0XFF,0XD8~0XFF,0XD9 之间的数据,保存为.jpg/.jpeg 文件,就可以直接在电脑上打开看到图像了。
JPEG和RGB565程序:

void OV2640_JPEG_Mode(void) 
{
   
	u16 i=0;
	//设置:YUV422格式
	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]); 
	} 
	//设置:输出JPEG数据
	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]);  
	}  
}
//OV2640切换为RGB565模式
void OV2640_RGB565_Mode(void) 
{
   
	u16 i=0;
	//设置:RGB565输出
	for(i=0;i<(sizeof(ov2640_rgb565_reg_tbl)/2);i++)
	{
   
		SCCB_WR_Reg(ov2640_rgb565_reg_tbl[i][0]
  • 16
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
OV2640是一种CMOS图像传感器,常用于数字摄像头。它具有200万像素,支持JPEG压缩格式,适用于在嵌入式系统中进行图像采集和处理。 STM32F103是一款32位ARM Cortex-M3内核的微控制器。它具有丰富的外设和强大的处理能力,是嵌入式系统开发中常用的控制器之一。 要在STM32F103上使用OV2640摄像头,首先需要连接它们之间的硬件接口。一般来说,OV2640摄像头需要通过I2C总线与STM32F103通信,以配置图像传感器的参数和获取图像数据。在连接完成后,我们可以编写代码来控制OV2640摄像头STM32F103之间的通信。 在编程方面,我们可以使用STM32的相关软件开发工具来编写代码。根据具体的应用需求,我们可以实现不同的功能,例如拍摄静态图像、录制视频、设置曝光时间和白平衡等。通过读取OV2640传感器的数据寄存器,我们可以采集摄像头的图像数据,并通过STM32的外设(例如SD卡或WiFi模块)将数据保存或传输到其他设备。 在开发过程中,需要注意一些常见的问题,例如硬件连接错误、摄像头驱动程序的编写和调试等。此外,为了实现更高性能的图像处理,可以借助STM32F103的DMA和硬件加速模块。 总而言之,OV2640摄像头STM32F103可以实现图像采集和处理的功能。通过适当的硬件连接和相应的编程,我们可以使用OV2640摄像头STM32F103上实现各种有趣的应用,如图像识别、监控系统等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值