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

基于STM32f103的OV7725摄像头驱动

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

& d8 Q; O% G8 z& x
基于STM32f103的OV7725摄像头驱动

: j' W: I5 w" l8 p/ a2 e" J

$ [# T- b, z$ `% t5 a9 f一、简介; x  Q% w" P. r8 h9 j
: f: B% A' [% d9 Y8 d* L7 u
实现的功能是三个按键实现LCD视频的显示以及超声波距离的显示,设定一个报警距离,这个可根据按键二和按键三改变报警距离。若所测距离大于报警距离,则蜂鸣器不报警,且LED为绿灯,若所测距离小于报警距离,则蜂鸣器报警且LED显示红灯。
( q, T& t" i7 |* R* B / l9 v8 [' E8 V# l" B2 j' t
流程图如下:
5 E' k4 j' R' H9 \- l& j 11.png
' E( U3 P1 G1 Y1 h
1、这次项目用的是OV7725,该摄像头主要由镜头、图像传感器、板载电路、FIFO 缓存及下方的信号引脚组成。* _6 s9 G3 N/ h* v' x+ j9 |  E
8 c, V, f, R% Y# }
以下为该摄像头的实体图和引脚图:
. T# |2 @+ z4 l6 D9 q0 n
12.png
  g( ~' ^: q1 }% s3 s
13.png
2、该摄像头与LCD的通讯:外部控制器对 OV7725 寄存器的配置参数是通过 SCCB 总线传输过去的,SCCB 总线跟 I2C 十分类似,所以在 STM32 驱动中可以直接使用片上 I2C 外设与它通讯。SCCB 的起始信号、停止信号及数据有效性与 I2C 完全一样,在 SCCB 协议中定义的读写操作与 I2C 也是一样的,这里就不多说了,学过32的人肯定都了解。6 n$ L7 W$ K: A" {' ]! [
( }) h! p6 Y" A
3、像素数据输出:
7 i1 F6 ~: i1 }: p5 O3 t! Z0 ?$ E 1 V/ y3 _; M, a8 n5 ?
  OV7725输出图像时则使用 VGA 或QVGA 时序。
" ]1 \; U; d; ^. s. I7 T6 [ 6 {3 n0 i/ a# v, u
  VGA 在输出图像分辨率为 480*640
6 \; b9 Q7 V* C0 t' B* B, q7 ] 6 y9 _% X# p$ |3 Z
  QVGA 是 Quarter VGA,其输出分辨率为 240*320
$ K1 K/ s/ i. U  OV7725 传感器输出图像时,一帧帧地输出,在帧内的数据一般从左到右,从上到下,一个像素一个像素地输出(也可通过寄存器修改方向)。在输出图像时,共有8种模式,我一般习惯于从左到右,从上到下,即模式6。
9 x; e8 y3 P! ~! K" r+ C . K3 Q. H' H9 i5 z% l4 W8 a
4、FIFO读写时序
, U2 C, d- q% g4 X. C
; n& V9 I# |4 T8 a3 _5 q1 v秉火的 OV7725 摄像头在图像传感器之外还添加了一个型号为 AL422B 的 FIFO,用于缓冲数据。AL422B 的本质是一种 RAM 存储器,它的容量大小为 393216 字节,支持同时写入和读出数据。
' {% e9 R, i& ~9 g8 c
# W+ ~6 i+ `; l/ f) a: K' s5、 摄像头驱动9 O# t, _" M' s& {+ t  q( k9 X
14.png
# {# O! F5 `, o5 z0 {
摄像头采集数据的过程如下:6 x" ^2 }$ E2 C; L3 _
(1) 利用 SIO_C、SIO_D 引脚通过 SCCB 协议向 OV7725 的寄存器写入初始化配置;
! X' w6 ~7 ]8 S6 S, J& I(2) 初始化完成后,OV7725 传感器会使用 VGA 时序输出图像数据,它的 VSYNC 会首先输出帧有效信号(低电平跳变),当外部的控制器(如 STM32)检测到该信号时,把 WEN 引脚设置为高电平,并且使用 WRST 引脚复位 FIFO 的写指针到 0 地址;
6 I5 z% G, l3 l3 u# n(3) 随着 OV7725 继续按 VGA 时序输出图像数据,它在传输每行有效数据时, HREF引脚都会持续输出高电平,由于 WEN 和 HREF 同时为高电平输入至与非门,使得其连接到 FIFO WE 引脚的输出为低电平,允许向 FIFO 写入数据,所以在这期间,OV7725 通过它的 PCLK 和 D[0:7]信号线把图像数据存储到 FIFO 中,由于前面复位了写指针,所以图像数据是从 FIFO 的 0 地址开始记录的;6 X0 }% L2 z' x5 j5 N% u! p
(4) 各行图像数据持续传输至 FIFO,受 HREF 控制的 WE 引脚确保了写入到 FIFO 中的都是有效的图像数据,OV7725 输出完一帧数据时,VSYNC 会再次输出帧有效信号,表示一帧图像已输出完成;& ~8 S) e( u; s* A) x+ U
(5) 控制器检测到上述 VSYNC 信号后,可知 FIFO 中已存储好一帧图像数据,这时控制 WEN 引脚为低电平,使得 FIFO 禁止写入,防止 OV7725 持续输出的下一帧数据覆盖当前 FIFO 数据;3 `' d" Q. V/ S: J7 D; s6 X7 ]4 B
(6) 控制器使用RRST复位读指针到FIFO的0地址,然后通过FIFO的RCLK和DO[0:7]引脚,从 0 地址开始把 FIFO 缓存的整帧图像数据读取出来。在这期间,OV7725是持续输出它采集到的图像数据的,但由于禁止写入 FIFO,这些数据被丢弃了;
/ m+ o2 X5 C) `/ M6 y1 |, Q 5 M# ^% B: D9 L
(7) 控制器使用 WRST 复位写指针到 FIFO 的 0 地址,然后等待新的 VSYNC 有效信号到来,检测到后把 WEN 引脚设置为高电平,恢复 OV7725 向 FIFO 的写入权限,OV7725 输出的新一帧图像数据会被写入到 FIFO 的 0 地址中,重复上述过程。摄像头的例程一般很容易找到,我主要说一下调试摄像头时遇到的问题。+ v4 X+ x, r; x2 f! [+ U

3 G& y' \0 q9 Q" v! G3 K1、因为之前就没有接触过摄像头,刚开始时LCD屏上显示的视频和图片都很模糊,以为是自己的代码写错了,分辨率设的太低,但是VGA和QVGA都试了,结果都是一样的。最后才发现这个摄像头可以调焦,被自己傻哭。
% V7 b% }8 N5 v( E7 A - C) s; z  ?6 ^$ n
2、因为这个项目的按键一是LCD模式转换,一开始设置的是只显示距离,然后按键转成显示视频,但转成视频模式后就再也转不过来了,一直显示的是视频。经过查阅资料后才知道要先关闭视频后才能转换,于是在按键一的模式二标志位(change)加了关闭摄像头(也就是让摄像头不采集也不显示)代码:% q/ P2 {$ B- D4 R
  1.   if(change==0)
    # o. B$ f5 }( E; h
  2. 0 u( J$ d. ?3 u- w$ t/ Q
  3.             {                  N+ M" Q8 m% T7 F/ {, s) d3 s
  4. / z! P4 u! G' L5 K# N! Z/ r
  5.                   ImagDisp(cam_mode.lcd_sx,cam_mode.lcd_sy,cam_mode.cam_width,cam_mode.cam_height);        //采集并显示   
    ( f' A4 h9 E, p0 v

  6. 2 W$ k) W- t: Z; ]8 N
  7.             }
    & K: g3 L, K6 V+ M7 w2 s4 b
  8. 3 k6 O* ?% c4 ~8 b0 ~5 W
  9.         else if(change==1)
    & o* b6 T9 @" R' Z, b  }  Q
  10. : K& _7 ]  m* Y' m
  11.                 break;  
复制代码
9 F) Q3 O& k" I" i
, W9 ~' ~0 F$ Q; l, i2 ?7 c
6 p! a7 g9 G- N' @
/ Y( [6 r; T  w& _: [

3 |1 F9 @& a1 J1 k$ j. c

' F: q) X  t8 @0 A9 {: ]$ a5 R! o1 o
收藏 2 评论1 发布时间:2020-10-21 09:47

举报

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

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版