当前位置:   article > 正文

#无FIFO驱动OV7670基于cubemx(草稿)

#无FIFO驱动OV7670基于cubemx(草稿)

1.前言

之前在淘宝买了一个不带FIFO的OV7670,由于比赛和其他事一直搁置,现在有时间于是想玩一玩。我发现网上这个的教程多为标准库,有些甚至利用了DCMI(数字摄像头接口,目前已知F4系列是有这个外设的)。标准库以及使用硬件外设使得它的移植不是那么友好,加上今年来ST官方大力推广HAL库以及CUBEMX的使用,于是我决定做一个CUBEMX驱动这个的教程。

无FIFO的OV7670更加考验单片机性能,并且坑比较多,大家如果还没有买,不要和我一样贪便宜买不带FIFO的

实物:

比较新的博客:

STM32F103C8T6基于库函数 驱动无FIFO的OV7670摄像头_stm32f103c8t6摄像头-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/sd3870582/article/details/136192947

2.设备

(1)单片机

STM32G474RET6,准备使用IO直驱,因为它没有DCMI接口,模拟的方式更加好移植。

(2)无FIFO的OV7670引脚定义

SCL-----------------------------------时钟线(SCCB)

SDA-----------------------------------数据线(SCCB)

VS-------------------------------------帧数据线(图像输出),信号出现说明一帧图像传输完成

HS-------------------------------------行数据线(图像输出),信号出现说明一帧图像的一行传输完成

PCLK---------------------------------像素时钟(OV7670输出给STM32

MCLK---------------------------------输入时钟(STM32输入给OV7670),使用MCO输入24MHz

D0到D7-------------------------------数据接口(图像信号输出给单片机)

(3)无FIFO的OV7670数据传输扫描方式

从左到右,从下到上

(4)使用的上位机

 直接显示在LCD屏幕上跨度太大,中间会出很多问题,我们先将图像输出到电脑上观察。一步一步慢慢来,华军软件园一般流氓软件较少。

山外多功能调试助手官方下载_山外多功能调试助手最新版_山外多功能调试助手1.1.1绿色版-华军软件园 (onlinedown.net)icon-default.png?t=N7T8https://www.onlinedown.net/soft/633190.htm

3.需要掌握的知识

(1)SSCB

这个是用来设置OV7670的,跟IIC很像,但不是同一个东西。SCCB有一个EN线,但是在OV7670中被省略了,因为没有必要。

参考文章

SCCB总线协议的详细讲解与程序实现-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_44509533/article/details/106053822

接口线

 起始时序

 

 结束时序

(2)部分问题踩坑解决

STM32驱动OV7670(无FIFO)相关问题的解决_ov7670怎么接stm32f103-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/wing_man/article/details/124070432

(3) 像素读取时序(RGB565,一个像素两个字节)

(4)VGA与QVGA的时序决定了垂直像素也需要*2

VGA像素:640*480

QVGA像素:320*240

4.开始驱动

由于这种传感器本身并不算简单,所以要做好付出大代价的准备。一步一步来,确保每一步的成功运行。

(1)读取OV7670的ID

参考文章

ov7670读取ID成功(不带FIFO),记录注意事项_ov7670的id-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_43145360/article/details/120224741

 一.cubemx配置及接线

配置外部时钟

配置时钟

 

配置SW调试下载

配置SCCB_SCL和SCCB_SDA

 

配置串口

 配置PWM输出(4MHz,50%占空比),用于输入MCLK,这个是非常重要的,输入这里最大为24MHz,输入的频率最好的4的整数倍。

PC2-------------SCCB_CSL

PC3-------------SCCB_SDA

PA6--------------MCLK(4MHz 50%占空比)

RST-------------3V3

PWNN----------GND 

 二、用下面这个函数检查ID是否正确读取

本人一般喜欢用在线调试打断点观察数据的变化,也可以使用串口打印的方式来检验这段代码是否正确运行。

 当最后能成功返回0时,说明初始化没问题。

记得取消注释(我之所以注释是为了更快调试验证ID,因为初始化序列没拷贝过来),现在可以拷贝过来了,取消注释。

三、ov7670.c代码部分讲解

编程手册链接:想要理解为什么这么配置主要对照手册这个来看,仅仅是使用不需要看

Keil_stm32f103c8t6/OV7670无FIFO/OV7670 software application note.pdf · lovefoolnotme/单片机 - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/lovefoolnotme/singlechip/blob/master/Keil_stm32f103c8t6/OV7670%E6%97%A0FIFO/OV7670%20software%20application%20note.pdf

白平衡设置(默认为自动白平衡调节,主函数中传入参数为0)

色度设置

 亮度调节

对比度

 特效设置

 对图像输出窗口进行设置(分辨率)

 (2)配置行同步(HS),帧同步(VS),像素时钟(PCLK)以及数据位

数据位:

D0---------D7配置为下拉输入,我的板子配置为PA0,PA1和PA7----PA12。这个最好配置为0到7或者8到15,要不然需要修改程序,我这里是没办法,有些引脚没有引出来。后续会分析为什么要修改程序,以及怎么修改。

 行同步和帧同步:

HS和VS配置为上拉输入,我的板子配置为PC8和PC9,PC8对应HS,PC9对应VS

素时钟PCLK配置:

PCLK配置为浮空输入,我的板子配置为PC6

(3)完成所有接线,令人心情愉悦

(4)移植image.c

这一步骤可能需要参考寄存器,寄存器参考

STM32寄存器的简介、地址查找,与直接操作寄存器_i2c是什么意思-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/geek_monkey/article/details/86291377

之前说过选择数据引脚时最好选择0到7或者8到15,因为这里移植的image.c中,读取数据位时,它直接操作了寄存器。

如果是低八位(0到7),那么就只需要像如图注释这样,直接

8位像素=GPIOX->IDR & 0XFF

如果是高八位(8到15),只需要

8位像素=(GPIO_IDR & 0XFF00)>>8

而我的由于不是这样,就只能编写一个函数来读取,这样可能会造成运行速度变慢,可能会出问题

  1. /*读取D0到D7的值
  2. D0-D1 PA0-PA1
  3. D2-D7 PA7-PA12
  4. IDR:
  5. 1111 1111 1111 1111
  6. 0001 1111 1000 0011
  7. */
  8. uint8_t DATA_8bit_Read(void)
  9. {
  10. uint8_t data1;
  11. uint8_t data2;
  12. uint8_t data3;
  13. uint8_t data4;
  14. uint8_t pix;
  15. data1= GPIOA->IDR & 0x0003; //3~0
  16. data2=(GPIOA->IDR & 0x0080)>>5; //7~4
  17. data3=(GPIOA->IDR & 0X0F00)>>5; //11~8
  18. data4=(GPIOA->IDR & 0X1000)>>5; //15~12
  19. pix=data1|data2|data3|data4;
  20. return pix;
  21. }

(5)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/479720
推荐阅读
相关标签
  

闽ICP备14008679号