尝试使用两个STM32驱动不带fifo的ov7670,未成功

注意,未成功!!!

工程链接:

https://wwvs.lanpv.com/b05eur3je
密码:91cm

参考资料

STM32F103C8T6+无FIFO的OV7670的输出测试图像实例代码-物联沃-IOTWORD物联网

【单片机开发】无FIFO的OV7670模组在STM32F1平台上的应用_只有dcmi才可以驱动无fifo的ov7670-CSDN博客


 

设备要求:

两块STM32F103系列芯片,2.8寸9341驱动的LCD屏,不带FIFO的OV7670x1,杜邦线若干

我使用的是一块RCT6,一块C8T6

接线:

OV7670:

与RCT6

VCC-3V3

GND-GND

SCL-PB10

SDA-PB11

VS-PB12

HS-PB13

PLK-PB14

D0~D7-PA0~PA7

RET-3V3

PWDN-GND

与C8T6

XLK-PA8

LCD屏

VCC-3.3V

GND-GND

CS-PB6

RST-PB7

DC-PB8

SDI(MISO)-PB5

SCK-PB9

LED-3V3

SDO(MISO)-PB4

文件介绍:

第一个文件:带RCT6软SPI字样,是下载到RCT6内部的,包括了OV7670与LCD屏的驱动程序

第二个文件:MCO,是下载到C8T6中的,作用是提供一个稳定8MHZ时钟

第三个文件是找商家要的资料

不成功的实验

这次实验是不成功的,摄像头不能输出收集到的图像到LCD屏,而是输出杂乱的图像

2a5476ffbda74860a7bb328c786e2cf9.jpeg9d1df0544ece41cb885d05713fc8d833.jpeg

fdc630877595498988e29aec4fc6d3fb.jpeg8574fd0815d94799bc2c3f248f04d74b.jpeg

如上图所示,我考虑过是否是摄像头损坏的问题,于是又去买了一个,但是那一个甚至无法输出图像而是完全的白屏,这些问题我现在没有能力也没有时间去解决。

可能的问题:

如何将RCT6代码移植到C8T6?

因为同为F103系列,所以只需在魔术棒中的Device选项里将RCT6改为C8T6即可。

可以更改引脚定义吗?

a6b71dc745414884b00ea394eb5097b4.png

必须根据引脚功能确定,如MISO可以是PB4但不能是PB5,6,7;以及MCO只有PA8一个,不可更改。

为什么图像显示是这样的?

OV7670是全彩的,也即2字节描述一个像素,OV7670共有480*640像素,因为LCD屏为320×240像素,所以显示一张图片需要307200字节,一个char占用2字节,所以如果想要完整存储一帧LCD图像需要一个大小为153600的char数组,但是这超过了F103可以使用的运存空间,我尝试之后发现它的1/4也即38400不会报错,所以我选择一次刷新1/4的屏幕;但是这是有很大问题的,我不知道OV7670传入的图像是按列传输还是按行传输。

写在最后

首先,当你想要尝试用F103系列开发板驱动不带FIFO的OV7670时,我必须劝你三思而行,这方面的资料是不多的,不带fifo都已经是少见,f103更是难上加难,以及市面上大部分厂家不带FIFO的OV7670摄像头并没有质保,你无法判断是自己的错还是产品的错;虽然不带FIFO的OV7670与STM32均诞生多年,但网络上似乎仍然没有一个科学系统的教程来指导开发,希望在不久的将来这一漏洞能被填补,即使这样并不具备实用价值,但至少能给不愿意购买动辄50元的带FIFOOV7670的人一种选择。

 

 

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较复杂的项目,需要你有一定的STM32和嵌入式开发经验。 首先,你需要了解OV7670摄像头的基本原理和接口。OV7670摄像头采用的是CMOS传感器,数据输出接口是8位并行接口。为了方便处理数据,我们需要将数据通过FIFO存储起来,然后通过DMA传输到外部存储器或者通过串口传输到PC机上。 以下是一个简单的OV7670驱动程序的框架: ```c #include "stm32f10x.h" #include "ov7670.h" #define FIFO_SIZE 512 // FIFO缓冲区大小 uint8_t fifo[FIFO_SIZE]; // FIFO缓冲区 // OV7670初始化函数 void ov7670_init(void) { // 初始化GPIO // ... // 初始化I2C // ... // 配置OV7670 // ... } // DMA传输完成中断处理函数 void DMA1_Channel3_IRQHandler(void) { // 将数据从DMA缓冲区复制到FIFO缓冲区 // ... // 清除DMA传输完成中断标志位 // ... } // 拍照函数 void ov7670_snapshot(void) { // 启动DMA传输 // ... // 等待DMA传输完成 // ... // 将FIFO缓冲区中的数据写入外部存储器或者通过串口传输到PC机上 // ... } int main(void) { // 初始化OV7670 ov7670_init(); while (1) { // 拍照 ov7670_snapshot(); } } ``` 具体实现细节需要根据硬件平台和软件工具链进行调整。在实现过程中,需要注意以下几点: 1. OV7670的寄存器配置需要根据具体的应用场景进行调整,可以参考OV7670的数据手册和其他资料。 2. FIFO缓冲区的大小需要根据传输速率和存储要求进行调整。 3. DMA传输需要配置正确的传输方向和传输长度,同时需要注意DMA传输完成中断的处理。 4. 外部存储器或者串口传输需要根据具体的应用场景进行调整,可以参考其他资料。 希望以上内容能够对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值