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

基于STM32f103的OV7725摄像头驱动

[复制链接]
STMCU-管管 发布时间:2020-10-21 09:47
- D9 J: {2 ^, _5 m- e
基于STM32f103的OV7725摄像头驱动

, m) G% p. Y9 @6 _3 K; Q( v

: M$ c$ W; s, x9 H- k* T; C+ M一、简介
6 L  w% r8 M8 Y" m $ f& w) ~0 i2 t# D
实现的功能是三个按键实现LCD视频的显示以及超声波距离的显示,设定一个报警距离,这个可根据按键二和按键三改变报警距离。若所测距离大于报警距离,则蜂鸣器不报警,且LED为绿灯,若所测距离小于报警距离,则蜂鸣器报警且LED显示红灯。
/ ~( \" p7 U- H7 y, i' ~
7 w% R1 q( Z: Y4 ?$ L流程图如下:
) k' r. U0 I1 M: `, N+ z$ v 11.png
+ v! l! @$ ?' T6 v& G
1、这次项目用的是OV7725,该摄像头主要由镜头、图像传感器、板载电路、FIFO 缓存及下方的信号引脚组成。5 v/ l) ^: l+ N& |7 z, p
8 s  f$ ?3 K. Y6 V
以下为该摄像头的实体图和引脚图:+ n# u2 H" S0 m" G# o  l
12.png
! a; N. p* A  L* G
13.png
2、该摄像头与LCD的通讯:外部控制器对 OV7725 寄存器的配置参数是通过 SCCB 总线传输过去的,SCCB 总线跟 I2C 十分类似,所以在 STM32 驱动中可以直接使用片上 I2C 外设与它通讯。SCCB 的起始信号、停止信号及数据有效性与 I2C 完全一样,在 SCCB 协议中定义的读写操作与 I2C 也是一样的,这里就不多说了,学过32的人肯定都了解。3 k1 Z& o$ Q' G
: m0 U1 A2 g; V
3、像素数据输出:
8 k; b- {- `- o % r7 C- b" c  ^+ ^
  OV7725输出图像时则使用 VGA 或QVGA 时序。  g' ^3 n8 q) L" E

' |( A- a- q2 e  VGA 在输出图像分辨率为 480*640
1 y/ t4 |8 Y' v( d, B6 l3 c 5 i' b; \9 I1 _8 r( q; z
  QVGA 是 Quarter VGA,其输出分辨率为 240*320
. T  l' \% g; A  C  OV7725 传感器输出图像时,一帧帧地输出,在帧内的数据一般从左到右,从上到下,一个像素一个像素地输出(也可通过寄存器修改方向)。在输出图像时,共有8种模式,我一般习惯于从左到右,从上到下,即模式6。
3 w) I. B, ?' T, u * Y* [3 P# C! d
4、FIFO读写时序
3 m# {% _4 t4 V, j1 I 5 N# N( g5 B8 R: v4 V. g' D
秉火的 OV7725 摄像头在图像传感器之外还添加了一个型号为 AL422B 的 FIFO,用于缓冲数据。AL422B 的本质是一种 RAM 存储器,它的容量大小为 393216 字节,支持同时写入和读出数据。
4 f- @0 N7 b& P8 A# z5 H" x/ ^ * Y2 w! j- q# b- d8 b% K/ j9 v) [
5、 摄像头驱动8 V( p6 c/ w0 B' F
14.png
) |+ t6 l) ?4 a5 R5 `. I
摄像头采集数据的过程如下:# [# V4 Q) ]+ l9 B, o) D6 a' J
(1) 利用 SIO_C、SIO_D 引脚通过 SCCB 协议向 OV7725 的寄存器写入初始化配置;
+ @8 t1 `, o+ k$ }(2) 初始化完成后,OV7725 传感器会使用 VGA 时序输出图像数据,它的 VSYNC 会首先输出帧有效信号(低电平跳变),当外部的控制器(如 STM32)检测到该信号时,把 WEN 引脚设置为高电平,并且使用 WRST 引脚复位 FIFO 的写指针到 0 地址;
5 G! G, a" {' G; v. O0 M(3) 随着 OV7725 继续按 VGA 时序输出图像数据,它在传输每行有效数据时, HREF引脚都会持续输出高电平,由于 WEN 和 HREF 同时为高电平输入至与非门,使得其连接到 FIFO WE 引脚的输出为低电平,允许向 FIFO 写入数据,所以在这期间,OV7725 通过它的 PCLK 和 D[0:7]信号线把图像数据存储到 FIFO 中,由于前面复位了写指针,所以图像数据是从 FIFO 的 0 地址开始记录的;
1 A) }0 R$ B' ^  w  T; ^7 y(4) 各行图像数据持续传输至 FIFO,受 HREF 控制的 WE 引脚确保了写入到 FIFO 中的都是有效的图像数据,OV7725 输出完一帧数据时,VSYNC 会再次输出帧有效信号,表示一帧图像已输出完成;
4 z( s0 `- B( q4 c(5) 控制器检测到上述 VSYNC 信号后,可知 FIFO 中已存储好一帧图像数据,这时控制 WEN 引脚为低电平,使得 FIFO 禁止写入,防止 OV7725 持续输出的下一帧数据覆盖当前 FIFO 数据;2 \. u5 t. E( c$ [
(6) 控制器使用RRST复位读指针到FIFO的0地址,然后通过FIFO的RCLK和DO[0:7]引脚,从 0 地址开始把 FIFO 缓存的整帧图像数据读取出来。在这期间,OV7725是持续输出它采集到的图像数据的,但由于禁止写入 FIFO,这些数据被丢弃了;
. {4 t' u4 Q, e( h3 d+ B
" ?7 q& v3 @8 |8 t6 z5 x/ M(7) 控制器使用 WRST 复位写指针到 FIFO 的 0 地址,然后等待新的 VSYNC 有效信号到来,检测到后把 WEN 引脚设置为高电平,恢复 OV7725 向 FIFO 的写入权限,OV7725 输出的新一帧图像数据会被写入到 FIFO 的 0 地址中,重复上述过程。摄像头的例程一般很容易找到,我主要说一下调试摄像头时遇到的问题。
9 v0 p# g* I9 Z5 V4 \" E9 j% m- t, X
9 ?+ \. a2 P, P$ F  L7 f1、因为之前就没有接触过摄像头,刚开始时LCD屏上显示的视频和图片都很模糊,以为是自己的代码写错了,分辨率设的太低,但是VGA和QVGA都试了,结果都是一样的。最后才发现这个摄像头可以调焦,被自己傻哭。- Q; n1 R" C9 W* L$ W

& a8 r! [5 R# I! X+ u2、因为这个项目的按键一是LCD模式转换,一开始设置的是只显示距离,然后按键转成显示视频,但转成视频模式后就再也转不过来了,一直显示的是视频。经过查阅资料后才知道要先关闭视频后才能转换,于是在按键一的模式二标志位(change)加了关闭摄像头(也就是让摄像头不采集也不显示)代码:
8 y" q( @: O2 y# H
  1.   if(change==0). Z1 T4 o4 o7 Q
  2. 0 X$ h( D2 Q! c8 ]4 r
  3.             {               
    : k; |, @  E) z

  4. & \' j: H+ o+ h: n9 U' }! U
  5.                   ImagDisp(cam_mode.lcd_sx,cam_mode.lcd_sy,cam_mode.cam_width,cam_mode.cam_height);        //采集并显示   * L. |7 z9 C; x/ `/ R& X) M3 h) O

  6. " \" `( x$ F# u' K% R9 ~$ c6 K4 l
  7.             }) k+ i& H2 c# G, S+ _# Z8 `( G
  8. ! N3 P+ T% B) x  u" M
  9.         else if(change==1)
    ; R. ]! k+ s2 R; v" |% y1 W

  10. - z4 L* R; j  ]- r4 E  `
  11.                 break;  
复制代码
$ w$ Z, v+ Y5 i  B& A0 E' O
0 r9 L* c# b, N; E1 v

; d7 U  L8 I( o

) n& `' `; X. e9 ]  j/ L3 u' s  Q% C7 ^! @! Y/ u+ d, J  c

/ A; Y- \& |4 t; M; O! P' G
赞 收藏 2 评论1 发布时间:2020-10-21 09:47

举报

1个回答
pkoko 回答时间:2020-10-23 12:34:57
驱动代码呢
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版