STM32
直播中

jjll652

8年用户 1399经验值
私信 关注
[问答]

如何利用stm32F4驱动摄像头在ILI9341显示屏上显示画面

如何利用STM32F4驱动摄像头在ILI9341显示屏上显示画面?

回帖(1)

李峰

2021-10-11 18:03:20
  我的目的很简单,就是利用stm32F4 驱动摄像头在我的ILI9341显示屏(240*320分辨率)上显示画面。
  把我手头上的器件图先给出把,换一种叙述的方式。
  
  在刚拿到这原理图是,其实是很懵的,虽然现在也没有多少的理解,但是这摄像头毕竟和淘宝上千篇一律的并不同,正点原子的那批带FIFO AL422B芯片,价格也偏高。
  
  看过了很多篇OV7725的文章之后,我开始纠结实物上器件的布局。
  因为我发现无论是我手头上的这个二手(同学那拿来的,不知道是不是野火的) 还是淘宝上看到的实物图,都没有发现晶振这玩意,这就导致我特别纠结,XCLK的来源在哪,反复看来看去,也不可能是外部输入的。后来看到这摄像头模块上的两个螺丝,本以为摄像头是焊牢在表面,其实并不是,拆开之后看到了新世界:
  想起来我之所以纠结这个,是因为之前照着正点原子STM32F1 相关的OV7725寄存器配置,用逻辑分析仪得出的波形特别不对劲,这里也就不浪费时间再弄出那些没意义的时序图了,(有空的话,贴上来把),等下贴正确的时序。在此顺便表达下我的想法,因为不论是TFT_LCD显示屏,还是这种摄像头,做32单片机教程的人总是喜欢将各种各样型号的lcd或者摄像头全部集成在一个工程里,而对于我们初学者,往往摄像头就只有一个,显示屏也只有一块,看到那复杂的工程真是令人头大。
  所以我现在所做的即从最简单的代码开始,之前对我手头上另一块R91506V3的普中屏有了一定的了解,这块LCDILI9341的显示屏有点不同,第一步就得理清楚,屏幕和摄像头哪些配置是必须的,哪些无关紧要(或者说为了更高级功能的开发),
  初学者就是得往简单的方面做起。写下这段话的时候,我还没有将显示屏的代码进行优化,(我发现商家写的代码过于冗杂),所以一定会想办法裁剪出合适的最小代码版。
  现在的进度还停留在显示屏可以正常显示图片,这一函数很重要,有些商家给的工程代码里并没有LCD_ShowPicture()函数,得率先理解那个函数里面的代码,毕竟是图像视频流的基础把。
  以上的基本也算是废话,讲点正题:
  相信如果有人能看我这帖子,一定也对QVGA Frame时序有了一定的了解,摘自OV7725_datasheet
  
  这个图,首先是存在问题的,QVGA的分辨率是320x240,那么最上面那个1240数字笔误,应当修正为240,同时这里得理解分辨率,320是水平像素点320个,垂直像素点为240个,而不是我之前一直以为的320行 240列,这里刚好反了一下。
  
  如果上面那个图理解了的话,这个图绝对是存在问题的,
  而网上杂七杂八的教程根本没有讲到特别重要的一个细节:
  即PCLK时钟输出,
  并不是固定在某一频率的,
  而是在HREF的高电平期间,才输出我们通过SCCB向摄像头配置好的PCLK频率。
  口说无凭,我用我那坚强的24MHz的逻辑分析仪抓取了摄像头的输出时序,VSYNC,HSYNC,PCLK
  这里设置的是QVGA输出,PCLK = 12MHz,也就是tpclk = 1/12MHz
  
  这里特别需要注意的是,最下面的PCLK并没有参考意义,因为毕竟我的逻辑分析仪采样率只有24MHz,显然是无法显现出12MHz的PCLK信号的,具体采样率和能显示的频率之间,还是一知半解的。
  看到VSYNC的频率为37.4,也就是我们常说的帧率fps37.4,算法如下:
  278 x 576 x 2 / 12M = 26.688ms 看的出来跟图上的26.305ms相差并不大
  
  上图是HSYNC的波形,看的出来,在HSYNC期间,PCLK开始会将数据进行输出,高电平持续时间为:
  320 x 2 /12MHz =53.33 us 和图上完全符合一致。
  然后我们转至具体的寄存器配置,这里的SCCB函数的编写,用了原子哥F1里的,
  只不过我们需要对GPIO口有所了解,以及F4和F1 GPIO配置接口的变化,这部分配置完,我用逻辑分析仪验证过是经得起使用的,但是以后肯定“手自笔录”,这段时间先能成功显示画面,后续一步一步改进。
  
  讲道理,寄存器的配置,最重要的只有两个:
  CLKRC COM7
  一个设置PCLK的输出频率(同时影响帧率)
  另一个设置是QVGA 还是VGA RGB565的设置(也会影响帧率)
  其他的寄存器,只是为了校准等其他花里胡哨的功能,等我后续再验证,只要上面两个设置好,
  一个简单的复位命令,将寄存器里的值复位到默认值,我觉得并不会怎么太影响画面。不然你看下面这些,看起来实在是太冗杂了:
  
  另外有关帧率的其他设置,其实还有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是专门硬件二值化的?所以不知道 原理图下三个数字芯片的功能怎么实现的???
举报

更多回帖

发帖
×
20
完善资料,
赚取积分