STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。

(本文建立在对OV7725有一定了解的基础上)

我的目的很简单,就是利用stm32F4 驱动摄像头在我的ILI9341显示屏(240*320分辨率)上显示画面。

把我手头上的器件图先给出把,换一种叙述的方式。

 

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第1张图片

在刚拿到这原理图是,其实是很懵的,虽然现在也没有多少的理解,但是这摄像头毕竟和淘宝上千篇一律的并不同,正点原子的那批带FIFO AL422B芯片,价格也偏高。

 

 

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第2张图片

 

 

看过了很多篇OV7725的文章之后,我开始纠结实物上器件的布局。

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第3张图片STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第4张图片STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第5张图片

因为我发现无论是我手头上的这个二手(同学那拿来的,不知道是不是野火的) 还是淘宝上看到的实物图,都没有发现晶振这玩意,这就导致我特别纠结,XCLK的来源在哪,反复看来看去,也不可能是外部输入的。后来看到这摄像头模块上的两个螺丝,本以为摄像头是焊牢在表面,其实并不是,拆开之后看到了新世界:

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第6张图片

 

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第7张图片

想起来我之所以纠结这个,是因为之前照着正点原子STM32F1 相关的OV7725寄存器配置,用逻辑分析仪得出的波形特别不对劲,这里也就不浪费时间再弄出那些没意义的时序图了,(有空的话,贴上来把),等下贴正确的时序。在此顺便表达下我的想法,因为不论是TFT_LCD显示屏,还是这种摄像头,做32单片机教程的人总是喜欢将各种各样型号的lcd或者摄像头全部集成在一个工程里,而对于我们初学者,往往摄像头就只有一个,显示屏也只有一块,看到那复杂的工程真是令人头大。

所以我现在所做的即从最简单的代码开始,之前对我手头上另一块R91506V3的普中屏有了一定的了解,这块LCDILI9341的显示屏有点不同,第一步就得理清楚,屏幕和摄像头哪些配置是必须的,哪些无关紧要(或者说为了更高级功能的开发)

初学者就是得往简单的方面做起。写下这段话的时候,我还没有将显示屏的代码进行优化,(我发现商家写的代码过于冗杂),所以一定会想办法裁剪出合适的最小代码版。

现在的进度还停留在显示屏可以正常显示图片,这一函数很重要,有些商家给的工程代码里并没有LCD_ShowPicture()函数,得率先理解那个函数里面的代码,毕竟是图像视频流的基础把。

 

以上的基本也算是废话,讲点正题:

相信如果有人能看我这帖子,一定也对QVGA Frame时序有了一定的了解,摘自OV7725_datasheetSTM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第8张图片

这个图,首先是存在问题的,QVGA的分辨率是320x240,那么最上面那个1240数字笔误,应当修正为240,同时这里得理解分辨率,320是水平像素点320个,垂直像素点为240个,而不是我之前一直以为的320行 240列,这里刚好反了一下。

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第9张图片

如果上面那个图理解了的话,这个图绝对是存在问题的,

而网上杂七杂八的教程根本没有讲到特别重要的一个细节:

PCLK时钟输出

并不是固定在某一频率的,

而是在HREF的高电平期间,才输出我们通过SCCB向摄像头配置好的PCLK频率。

 

口说无凭,我用我那坚强的24MHz的逻辑分析仪抓取了摄像头的输出时序,VSYNC,HSYNC,PCLK

这里设置的是QVGA输出,PCLK = 12MHz,也就是tpclk = 1/12MHz

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第10张图片

这里特别需要注意的是,最下面的PCLK并没有参考意义,因为毕竟我的逻辑分析仪采样率只有24MHz,显然是无法显现出12MHz的PCLK信号的,具体采样率和能显示的频率之间,还是一知半解的。

看到VSYNC的频率为37.4,也就是我们常说的帧率fps37.4,算法如下:

278 x 576 x 2 / 12M = 26.688ms 看的出来跟图上的26.305ms相差并不大

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第11张图片

上图是HSYNC的波形,看的出来,在HSYNC期间,PCLK开始会将数据进行输出,高电平持续时间为:

320 x 2 /12MHz =53.33 us 和图上完全符合一致。

 

然后我们转至具体的寄存器配置,这里的SCCB函数的编写,用了原子哥F1里的,

只不过我们需要对GPIO口有所了解,以及F4和F1 GPIO配置接口的变化,这部分配置完,我用逻辑分析仪验证过是经得起使用的,但是以后肯定“手自笔录”,这段时间先能成功显示画面,后续一步一步改进。

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第12张图片

讲道理,寄存器的配置,最重要的只有两个:

CLKRC  COM7

一个设置PCLK的输出频率(同时影响帧率)

另一个设置是QVGA 还是VGA  RGB565的设置(也会影响帧率)

其他的寄存器,只是为了校准等其他花里胡哨的功能,等我后续再验证,只要上面两个设置好,

一个简单的复位命令,将寄存器里的值复位到默认值,我觉得并不会怎么太影响画面。不然你看下面这些,看起来实在是太冗杂了:

 

 

 

STM32F407 与OV7725 之间的故事 (不带FIFO),连载ing。。。。。。_第13张图片

另外有关帧率的其他设置,其实还有EXHCL EXHCH这些很陌生的寄存器影响,具体目前也不是很清楚,后续再研究,所以不必纠结一定要设置,只要摄像头复位了,这些寄存器的值保持默认就一点关系都没有,即可以直接留几条重要的命令,省的麻烦。

同时网上还有说什么摄像头的eeprom不稳定,每次都得初始化的言论存疑?? 我重新读取了下,之前存进去的数据,并没有出现重新上电(注释掉OV7725初始化函数)之前配置数据丢失的情况,eeprom不是出了名的掉电不丢失数据吗?待验证。。。

 

所以目前的进度到这,虽然离显示画面还挺遥远的,但是方向很重要,

下一步不是将画面同步到显示屏上,而是打算先利用中断取一帧画面传到电脑上,

估摸着用串口传输,240*320*2个字节数据要在53.3us内采集出来,不知道会遇到什么困难险阻,哎,可能后续会用上DMA(现在也还是不熟悉),或者直接GPIO口read,用寄存器操作速度快一点,同时现在对时钟树不了解,肯定得进一步提高语句执行的速度的,以及那让人现在有点忘而却步的DCMI接口,先试试看GPIO采集,后续也一定要融合出多种版本的,

只要这一步成了,其实距离动态显示画面也不远了。

ps,在纠结摄像头前几天,倒是用IO口模拟出R61509V显示屏的时序,其实真的很简单。后续再重新自己配置FSMC

加油把。

2019.9.19:

摄像头借的,不得已得还回去,连JLink调试器都没了,暂时搁置这个工程了,等自己的ILI9341和R61509V3接口的转接板到了,先行鼓捣下ILI9341在普中的stm32F103上的驱动显示(毕竟那个开发板还有一键USB下载,自己最小的F4开发板并没有串口下载的驱动),能和R61509V一样方便之后,再重新买个OV7670不带FIFO,淘宝20块的那种继续研究把。。。另外似乎上述的OV7725是专门硬件二值化的?所以不知道 原理图下三个数字芯片的功能怎么实现的???

 

你可能感兴趣的:(MCU,嵌入式)