STM32F407驱动无FIFO的OV7670并在SPI屏幕上显示出来
由于网络上的例程太过于抽象。我这个小趴菜边摸着,边写,终于弄出来了。
PA8记得连到XCLK,就是摄像头的时钟输入引脚


10月8号更新
先放上工程链接:
通过网盘分享的文件:OV7670.rar
链接: https://pan.baidu.com/s/1A2FY_FBu6LK3H4XFFOpv-Q?pwd=fg92 提取码: fg92
(看到那些收费的帖子,有点难受,我这样分享出来,会不会拆了别人后台?虽然我也挺穷的,最近在吃泡面)
寄存器功能上已经备注完了,但我没自己去修改寄存器的值,还是用着别人的(小声逼逼一句:怎么同一个寄存器,你能配置那么多遍啊?到底当初是谁写得代码?),你们要是想去尝试,可以按照我给的备注修改试试看。
关键寄存器介绍

这个寄存器是给这个传感器设置工作时钟的,我的这个程序,按照那个抄过来配置表,貌似只能输入8MHz给这个传感器,才能正常工作,可能还有其他寄存器的锁相环之类的设置需要修改吧?也有可能我这个芯片发挥不出来这个传感器的性能,我提高了时钟,结果显示有问题,貌似是处理不过来的样子。
这个内部时钟频率越高,输出帧数也越高,总之,我这个板子、摄像头、屏幕的价格总共才50块钱,根本不能照亮我的美!!!!!


这几个传感器,用来设置输出窗口的可以看看官方文档的时序图

HREF(这里都是说的时序图中的HREF,不是上面寄存器的)就是HSTOP减去HSTART的值,从默认值计算来看,HREF就是776-136为640,刚好符合上面的图,然后应该还有VREF的图,我是说如同这个时序图一样,有个垂直传完480行后,的时序,不过图中已经用HREF代替了
这里有个关键点。左下角有个Note,就是你设置输出的格式,比如RGB的方式,记得要给像素时钟乘上PCLK,程序中有个设置窗口的函数,里面横向、纵向的像素要乘2,就是这个原因,你要是用Raw data,那就不用乘了。我的屏幕是RGB565,所以我需要。
SCCB的时序
SCCB的时序跟I2C是一样的,只是输入的数据帧有所区别
1.写时序
不能连续写,不如I2C方便,你写一个寄存器还得暂停一次,再启动,再写。

这里的ID Address(w)在官方文档中有描述

0x42写,0x43读
2.读时序

读时序,你要先输入0x42然后寄存器地址,接着马上停止,然后再启动一次,再发送寄存器地址,接着就是读了,读完了后,保持一段数据引脚高电平,就是不用给从机发送响应,然后停止。
这里的X是指不用管什么读取响应,发送响应什么的,不过你也可以当作有响应。我测试的时候,传感器确实是有响应的。
窗口设置程序说明
(这个程序是抄过来的)

这个程序中为什么,开始的x和y坐标有个176和12的数值?
我问了der包,der包说什么,摄像头传感器会有个消隐阶段,官方的默认文档中sx起始值应该是136,我使用136去设置,发现接收不到图像数据。貌似是什么前肩和后肩吧,这个值我找了好几个传感器去计算,也不知道怎么得出来的,那我就当它是经验尝试,试出来的吧。(毕竟sci一区的论文,有些公式都是莫名其妙出来的,说的就是你——路径规划)
作者的一点建议
1.可能有些人会问:stm32f103系列的板子能不能用这种无fifo的摄像头?
我觉得是可以的,fifo的本质就是个缓冲区,为了匹配数据传输速度用的。网上也有人这么干过,也确实实现了。但是我想说一句“没苦硬吃这一块”。f103你超频,超冒烟,还要设置一堆东西,最后得出的帧数,f407一样。
你要是时间多当我没说。我也是学生,算是时间相对来说很多的了,才跑去研究这寄存器,要不然我直接网上例程下下来,直接套上能用就完事了,马上出业务。
f103的话,我建议买有fifo的摄像头,驱动程序还能写得简单点。
2.也有人可能会问:你为什么用DCMI+DMA的方式实现?
如果不使用这个接口,我就需要在中断中处理数据,大家可以看看像素时序图,你要填满240x240的屏幕,需要处理多少次中断?那中断次数能让你的开发板处理器一直在中断里出不来。所以,我在阅读了st公司官方文档后,得出使用DCMI+DMA的方式,是最合理的实现方式。

最后,我觉得性价比最高的方式,就是我这个方式,一个带fifo的ov7670,可以买我这一套了。
2025年10月8日 项目施工完成,还有想问的,直接留言,我尽量解答
更多推荐



所有评论(0)