赞
踩
之前在淘宝买了一个不带FIFO的OV7670,由于比赛和其他事一直搁置,现在有时间于是想玩一玩。我发现网上这个的教程多为标准库,有些甚至利用了DCMI(数字摄像头接口,目前已知F4系列是有这个外设的)。标准库以及使用硬件外设使得它的移植不是那么友好,加上今年来ST官方大力推广HAL库以及CUBEMX的使用,于是我决定做一个CUBEMX驱动这个的教程。
无FIFO的OV7670更加考验单片机性能,并且坑比较多,大家如果还没有买,不要和我一样贪便宜买不带FIFO的。
实物:
比较新的博客:
STM32G474RET6,准备使用IO直驱,因为它没有DCMI接口,模拟的方式更加好移植。
SCL-----------------------------------时钟线(SCCB)
SDA-----------------------------------数据线(SCCB)
VS-------------------------------------帧数据线(图像输出),信号出现说明一帧图像传输完成
HS-------------------------------------行数据线(图像输出),信号出现说明一帧图像的一行传输完成
PCLK---------------------------------像素时钟(OV7670输出给STM32)
MCLK---------------------------------输入时钟(STM32输入给OV7670),使用MCO输入24MHz
D0到D7-------------------------------数据接口(图像信号输出给单片机)
从左到右,从下到上
直接显示在LCD屏幕上跨度太大,中间会出很多问题,我们先将图像输出到电脑上观察。一步一步慢慢来,华军软件园一般流氓软件较少。
这个是用来设置OV7670的,跟IIC很像,但不是同一个东西。SCCB有一个EN线,但是在OV7670中被省略了,因为没有必要。
参考文章
SCCB总线协议的详细讲解与程序实现-CSDN博客https://blog.csdn.net/weixin_44509533/article/details/106053822
接口线
起始时序
结束时序
VGA像素:640*480
QVGA像素:320*240
由于这种传感器本身并不算简单,所以要做好付出大代价的准备。一步一步来,确保每一步的成功运行。
参考文章
配置外部时钟
配置时钟
配置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
本人一般喜欢用在线调试打断点观察数据的变化,也可以使用串口打印的方式来检验这段代码是否正确运行。
当最后能成功返回0时,说明初始化没问题。
记得取消注释(我之所以注释是为了更快调试验证ID,因为初始化序列没拷贝过来),现在可以拷贝过来了,取消注释。
编程手册链接:想要理解为什么这么配置主要对照手册这个来看,仅仅是使用不需要看
白平衡设置(默认为自动白平衡调节,主函数中传入参数为0)
色度设置
亮度调节
对比度
特效设置
对图像输出窗口进行设置(分辨率)
数据位:
D0---------D7配置为下拉输入,我的板子配置为PA0,PA1和PA7----PA12。这个最好配置为0到7或者8到15,要不然需要修改程序,我这里是没办法,有些引脚没有引出来。后续会分析为什么要修改程序,以及怎么修改。
行同步和帧同步:
HS和VS配置为上拉输入,我的板子配置为PC8和PC9,PC8对应HS,PC9对应VS
像素时钟PCLK配置:
PCLK配置为浮空输入,我的板子配置为PC6
这一步骤可能需要参考寄存器,寄存器参考
STM32寄存器的简介、地址查找,与直接操作寄存器_i2c是什么意思-CSDN博客https://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
而我的由于不是这样,就只能编写一个函数来读取,这样可能会造成运行速度变慢,可能会出问题
- /*读取D0到D7的值
- D0-D1 PA0-PA1
- D2-D7 PA7-PA12
- IDR:
- 1111 1111 1111 1111
- 0001 1111 1000 0011
-
- */
- uint8_t DATA_8bit_Read(void)
- {
- uint8_t data1;
- uint8_t data2;
- uint8_t data3;
- uint8_t data4;
- uint8_t pix;
- data1= GPIOA->IDR & 0x0003; //3~0
- data2=(GPIOA->IDR & 0x0080)>>5; //7~4
- data3=(GPIOA->IDR & 0X0F00)>>5; //11~8
- data4=(GPIOA->IDR & 0X1000)>>5; //15~12
- pix=data1|data2|data3|data4;
- return pix;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。