请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32f103的OV7725摄像头驱动

[复制链接]
STMCU-管管 发布时间:2020-10-21 09:47

1 j- Q2 {  s* |* J) c* q
基于STM32f103的OV7725摄像头驱动

* Q2 J. O2 T+ q8 ^  u+ L' v2 G

" H8 F3 Q6 n. ?! |& ^一、简介2 w( J  X6 c8 S( F

# B5 A4 j; v' S) Y  K- o 实现的功能是三个按键实现LCD视频的显示以及超声波距离的显示,设定一个报警距离,这个可根据按键二和按键三改变报警距离。若所测距离大于报警距离,则蜂鸣器不报警,且LED为绿灯,若所测距离小于报警距离,则蜂鸣器报警且LED显示红灯。
6 T! J2 {8 t; G
7 d) l& ?6 P. \0 ], T; T流程图如下:
) ?# G% j( }9 S  @- _/ m2 L 11.png
. U5 p2 S$ H6 A9 ]0 G9 z
1、这次项目用的是OV7725,该摄像头主要由镜头、图像传感器、板载电路、FIFO 缓存及下方的信号引脚组成。: [' D: ]& C7 a* V# O
6 s( g& k7 q5 [+ ^/ }
以下为该摄像头的实体图和引脚图:
: B9 [' p5 z0 i. X0 k' V6 v6 r+ M* c
12.png
2 ~9 i  M% w$ i
13.png
2、该摄像头与LCD的通讯:外部控制器对 OV7725 寄存器的配置参数是通过 SCCB 总线传输过去的,SCCB 总线跟 I2C 十分类似,所以在 STM32 驱动中可以直接使用片上 I2C 外设与它通讯。SCCB 的起始信号、停止信号及数据有效性与 I2C 完全一样,在 SCCB 协议中定义的读写操作与 I2C 也是一样的,这里就不多说了,学过32的人肯定都了解。; j! i, o- e6 O& y1 d
! Y; g7 _+ X! u8 B+ H
3、像素数据输出:7 v7 U! |1 J3 d: X

1 L; M4 n! n* Y1 c9 L) `  OV7725输出图像时则使用 VGA 或QVGA 时序。
4 e0 H1 L& }1 X4 O% { * J* L" Q1 k2 |0 o# u
  VGA 在输出图像分辨率为 480*640
9 Y+ X: H8 p# ^# h% s3 @
% f2 w# Y. O7 i+ J. r& d+ v; H  QVGA 是 Quarter VGA,其输出分辨率为 240*320
* V/ O6 {/ a+ p  ^) D  OV7725 传感器输出图像时,一帧帧地输出,在帧内的数据一般从左到右,从上到下,一个像素一个像素地输出(也可通过寄存器修改方向)。在输出图像时,共有8种模式,我一般习惯于从左到右,从上到下,即模式6。
/ E' C7 X6 o/ B0 N1 @$ F) U
- w) D$ ^* e, k8 B  J9 ?. T6 f7 k4、FIFO读写时序
+ F, \" I3 h7 D8 W3 w  K
8 R& X; G& E) o$ @$ [秉火的 OV7725 摄像头在图像传感器之外还添加了一个型号为 AL422B 的 FIFO,用于缓冲数据。AL422B 的本质是一种 RAM 存储器,它的容量大小为 393216 字节,支持同时写入和读出数据。
' b7 D6 v& d% B# c. Z
8 l. u8 `* m5 e  T4 p! n5、 摄像头驱动: @3 ]/ x' s  X& F) v% `/ Y/ H
14.png
+ z1 o3 K( x3 n" }; n
摄像头采集数据的过程如下:! m" O; [5 p; f) O
(1) 利用 SIO_C、SIO_D 引脚通过 SCCB 协议向 OV7725 的寄存器写入初始化配置;
. a+ R2 i) w( i2 j(2) 初始化完成后,OV7725 传感器会使用 VGA 时序输出图像数据,它的 VSYNC 会首先输出帧有效信号(低电平跳变),当外部的控制器(如 STM32)检测到该信号时,把 WEN 引脚设置为高电平,并且使用 WRST 引脚复位 FIFO 的写指针到 0 地址;$ F- i3 s( S) u0 J
(3) 随着 OV7725 继续按 VGA 时序输出图像数据,它在传输每行有效数据时, HREF引脚都会持续输出高电平,由于 WEN 和 HREF 同时为高电平输入至与非门,使得其连接到 FIFO WE 引脚的输出为低电平,允许向 FIFO 写入数据,所以在这期间,OV7725 通过它的 PCLK 和 D[0:7]信号线把图像数据存储到 FIFO 中,由于前面复位了写指针,所以图像数据是从 FIFO 的 0 地址开始记录的;
3 U- y: U5 S& O: D; d(4) 各行图像数据持续传输至 FIFO,受 HREF 控制的 WE 引脚确保了写入到 FIFO 中的都是有效的图像数据,OV7725 输出完一帧数据时,VSYNC 会再次输出帧有效信号,表示一帧图像已输出完成;! \6 a& ?1 j/ P3 C! E6 O$ b
(5) 控制器检测到上述 VSYNC 信号后,可知 FIFO 中已存储好一帧图像数据,这时控制 WEN 引脚为低电平,使得 FIFO 禁止写入,防止 OV7725 持续输出的下一帧数据覆盖当前 FIFO 数据;/ r) ^0 W, s6 p  z, {; e: W" ~" u
(6) 控制器使用RRST复位读指针到FIFO的0地址,然后通过FIFO的RCLK和DO[0:7]引脚,从 0 地址开始把 FIFO 缓存的整帧图像数据读取出来。在这期间,OV7725是持续输出它采集到的图像数据的,但由于禁止写入 FIFO,这些数据被丢弃了;+ t7 I/ f, w$ }/ \+ E
2 `! ~& E' F2 h+ `. }  G
(7) 控制器使用 WRST 复位写指针到 FIFO 的 0 地址,然后等待新的 VSYNC 有效信号到来,检测到后把 WEN 引脚设置为高电平,恢复 OV7725 向 FIFO 的写入权限,OV7725 输出的新一帧图像数据会被写入到 FIFO 的 0 地址中,重复上述过程。摄像头的例程一般很容易找到,我主要说一下调试摄像头时遇到的问题。! o: J7 P6 C8 ?" G: u

- r* [, h5 C: B: A& a4 w1、因为之前就没有接触过摄像头,刚开始时LCD屏上显示的视频和图片都很模糊,以为是自己的代码写错了,分辨率设的太低,但是VGA和QVGA都试了,结果都是一样的。最后才发现这个摄像头可以调焦,被自己傻哭。& e  X$ A) k# V

( Q3 f! [7 ~$ c) U( a2、因为这个项目的按键一是LCD模式转换,一开始设置的是只显示距离,然后按键转成显示视频,但转成视频模式后就再也转不过来了,一直显示的是视频。经过查阅资料后才知道要先关闭视频后才能转换,于是在按键一的模式二标志位(change)加了关闭摄像头(也就是让摄像头不采集也不显示)代码:
4 m: J5 ]  s7 J1 r; d. {6 b- S, w/ i
  1.   if(change==0)
    % ^2 S0 r: |$ ?) [! p; _
  2. , t9 H# n" @; C) n, o$ {' \/ g2 h
  3.             {                & l/ ]. b: X, Y5 E8 [+ |  k

  4. 4 O  i# E( e% z* e4 K
  5.                   ImagDisp(cam_mode.lcd_sx,cam_mode.lcd_sy,cam_mode.cam_width,cam_mode.cam_height);        //采集并显示   
    1 |; {! z/ |- K% a, P- ]9 ^
  6. ) d1 _/ h# X6 ]+ q
  7.             }( ^( r; {8 A( J1 m5 ?

  8. - S! L+ n( @" x
  9.         else if(change==1)
    ' j: o6 a; a# q+ u5 x" @" @

  10. 6 \$ t9 b" l6 N1 g
  11.                 break;  
复制代码

" W0 ?& _7 p! _+ ?3 v; z
2 Y7 g$ X2 X  Z+ c4 r

! [( [1 E$ C, @, H, g8 ]: H: D7 p( t

# J1 i1 j' ~. C& t. E0 N2 y0 x6 e; s( F$ Y7 L( E* u( m

* |* F4 _  |8 `
收藏 2 评论1 发布时间:2020-10-21 09:47

举报

1个回答
pkoko 回答时间:2020-10-23 12:34:57
驱动代码呢

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版