OV7670 STM32驱动 YUYV格式调试总结

前言

单片机只有能够看见世界,才能真正的走向智能化,所以,用单片机驱动摄像头很有必要。而在摄像头当中,OV7670是比较经典的一款。

硬件准备

1 .STM32开发板;
2. OV7670模块;

OV7670基础知识

驱动源程序直接用某点原子的挺好,这里就不贴出来了。
1、存储(OV7670往FIFO中写数据)
战舰OV7670模块存储图像数据的过程为:main_等待OV767同步信号->main_帧同步信号触发中断->exti_FIFO写指针复位->exti_FIFO写使能->main_等待第二个同步信号(如果第一帧还没处理完第二帧中断到来则FIFO写禁止)

	OV7670_WREN=1;		//允许写入FIFO
	OV7670_WRST=0;	 	//复位写指针		  		 
	OV7670_WRST=1;	

之后摄像头传感器会自动快速存储像素到FIFO

2、读取(MCU从FIFO中读取数据)
读取过程:FIFO读指针复位->给FIFO读时钟(FIFO RCLK)->读取第一个像素高字节->给FIFO读时钟(FIFO RCLK)->读取第一个像素低字节->给FIFO读时钟(FIFO RCLK)->读取第二个像素高字节->循环读取剩余像素->将所有像素值依次显示在LCD上或存储在数组里面
关于数据量,比如QVGA模式,RGB565格式,我们总共循环读取3202402次,读取一帧数据

		OV7670_RRST=0;				//开始复位读指针 
		OV7670_RCK_L;
		OV7670_RCK_H;
		OV7670_RCK_L;
		OV7670_RRST=1;				//复位读指针结束 
		OV7670_RCK_H;

然后FIFO就会按照从上到下,从左到右的顺序依次输出像素

调试记录

1.配置灰度输出遇到的问题以及解决办法
在寄存器配置上,在正点原子代码基础上,更改寄存器配置

	{0x12,0x10},
	{0x3a, 0x14},
	{0x3d, 0x80}, 
	{0x67, 0x11},  
	{0x68, 0xFF}, 
	{0x40, 0xC0},

直接添加在OV7670.config文件末尾就行,就会得到YUYV格式的输出,每个像素会传来两个字节,只要高字节,第2,4,6等字节直接扔掉不要,然后为了在LCD上得到显示结果,需要将256灰度转化为RGB565而在LCD上显示,综合代码如下

	OV7670_RCK_L;
	color=GPIOC->IDR&0XFF;	//读数据
	OV7670_RCK_H; 
	color<<=8;  
	OV7670_RCK_L;
	//color|=GPIOC->IDR&0XFF;	//读数据
	OV7670_RCK_H; 
	color_r = color&0xf800;
	color_b = color>>11;
	color_g =(color>>5)&0x07e0; 
	LCD->LCD_RAM= color_r + color_g + color_b;  

接下来会发现还有问题,那就是屏幕碎片化,闪动严重,原因有二:
第一是因为在正点原子代码上有"FIFO"还没有写入完毕而提前被LCD读取完了,LCD后半截时有时无,就造成了比较大但范围又相似的抖动,正点原子代码如下:

	OV7670_WREN=1;		//允许写入FIFO
	OV7670_WRST=0;	 	//复位写指针		  		 
	OV7670_WRST=1;	
	ov_sta++;

应该更正为:

	if(ov_sta==0)
	{			
	OV7670_WREN=1;		//允许写入FIFO
	OV7670_WRST=0;	 	//复位写指针		  		 
	OV7670_WRST=1;	
	ov_sta++;			
	}else 
	{
	OV7670_WREN=0;		//禁止写入FIFO 
	OV7670_WRST=0;	 	//复位写指针		  		 
	OV7670_WRST=1;				
	}

第二会发现屏幕有很多毛刺尖锐闪动,是因为屏幕刷新率太高,这是源代码:

	while(1)
		OV7670_camera_refresh();

但是应该人为的减慢这个速度或者固定下来,比如改为10帧的刷新率,改进后的代码为:

while(1)
	{	
		delay_ms(100);
		OV7670_camera_refresh();	//更新显示
	}	 

LCD上的显示完美输出

总结

这种点对点的摄像头,并不适合入门,资金充裕的话建议入手openmv,又快又方便。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值