家庭IOT监测之摄像头OV7670测试

news/2024/11/15 6:17:31/

本篇目标:使用STM32F407驱动摄像头OV7670,并上位机显示照片结果。

材料准备:

  • STM32F4标准工程:stm32f407自建标准工程(stm32f4标准工程)(git仓库地址)
  • STM32F4摄像头测试工程:里面包含ov7670驱动文件、STM32F4摄像头测试工程,上位机测试软件(stm32f4摄像头测试最终工程)(git仓库地址)

摄像头OV7670硬件连接与接口

这里使用的模块是OV7670不带FIFO的版本,使用STM32F407的DCMI+DMA进行数据传输,保证数据的速度,并把数据提取出来发送到上位机显示照片。
摄像头与STM32F4的连接如图:
这里写图片描述


测试摄像头OV7670驱动

用keil打开STM32F4标准工程,往里面添加代码,测试摄像头OV7670:

  • 将准备材料测试工程中的摄像头驱动文件夹(ov7670)拷贝到stm32f407标准工程dev文件夹(新建)下。
  • 在Manage Project Items添加文件夹ov7670,然后添加刚才拷贝文件夹下的C文件。
  • 在Options->C/C+±>Include Paths添加dev下复制文件夹ov7670的路径。
  • 需要修改ov7670.h与sccb.h文件中对应的IO引脚,修改成自己对应的引脚口,应该用注释标出。
  • 仔细检查ov7670.c与sccb.c文件中的引脚初始化函数,确认相关RESET、PWDN、SCCB等引脚初始化正确;修改dcmi.c的My_DCMI_Init函数中对于DCMI相关引脚的初始化,与自己的引脚对应。
  • 在main.c中添加头文件:
#include "ov7670.h"
#include "dcmi.h"
#include "ov7670test.h"
  • 添加全局变量:
extern u8 ov_rev_ok;
  • 向main函数中添加代码,如下:
int main(void)
{/* stm32系统配置 */Sys_Config();//新添加if (OV7670_Init() != 0){printf("ov7670 init error.\r\n");}else{OV7670_USART_Init();}while(1){LED1_ON;delay_ms(100);//新添加if (ov_rev_ok){ShanWai_SendCamera(camera_buffer, PIC_WIDTH, PIC_HEIGHT);ov_rev_ok = 0;}else{DCMI_Start();}LED1_OFF;delay_ms(100);}
}
  • 编译通过后,烧写进STM32F4,首先观察Printf串口打印,是否有错误信息?
  • 连接串口2至PC机,打开山外多功能调试助手->智能车助手:选择对应com口,波特率修改成最大值与代码一致,宽对应代码ov7670.h->PIC_WIDTH宏定义,高对应PIC_HEIGHT宏定义,小端对齐,打开串口。
  • 等待图像区显示图像,如图:
    这里写图片描述

摄像头OV7670代码解析

在这里解析一下OV7670的代码,先看一张代码的流程图:
这里写图片描述
看几个重要函数:

  • OV7670_Init
u8 OV7670_Init(void)
{u16 i=0;u16 reg=0;/* RESET/PWDN引脚初始化 */OV7670_RST_PW_Init();OV7670_PWDN_L;	//POWER ONdelay_ms(100);OV7670_RST_L;	//复位OV7670delay_ms(100);OV7670_RST_H;	//结束复位 /* SCCB引脚初始化 */SCCB_Init();        		//初始化SCCB 的IO口	SCCB_WR_Reg(0X12, 0x80);	//软复位OV7670delay_ms(50); reg=SCCB_RD_Reg(0X1c);	//读取厂家ID 高八位reg<<=8;reg|=SCCB_RD_Reg(0X1d);	//读取厂家ID 低八位if(reg!=OV7670_MID){printf("\r\nMID:%d\r\n",reg);return 1;}reg=SCCB_RD_Reg(0X0a);	//读取厂家ID 高八位reg<<=8;reg|=SCCB_RD_Reg(0X0b);	//读取厂家ID 低八位if(reg!=OV7670_PID){printf("HID:%d\r\n\r\n",reg);return 2;}   //初始化配置 OV7670寄存器,采用QVGA分辨率(320*240)  for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++){SCCB_WR_Reg(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);} //裁剪摄像头照片尺寸,参数:起始坐标x、y;长度、高度;裁剪长高不可大于上面设置的分辨率OV7670_Window_Set(PIC_START_X,PIC_START_Y,PIC_WIDTH,PIC_HEIGHT);/* 白平衡设置,默认值0 */OV7670_Light_Mode(0);/* 色度设置,默认值2 */OV7670_Color_Saturation(2);/* 亮度设置,默认值2 */OV7670_Brightness(1);/* 对比度设置,默认值2 */OV7670_Contrast(2);/* DCMI初始化,包括IO口和中断 */My_DCMI_Init();/* DCMI DMA设置,数据指向照片数组camera_buffer */DCMI_DMA_Init((uint32_t)&camera_buffer,sizeof(camera_buffer)/4,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA return 0x00; 	//ok
} 
  • DMA2_Stream1_IRQHandler
void DMA2_Stream1_IRQHandler(void)
{        if(DMA_GetFlagStatus(DMA2_Stream1,DMA_FLAG_TCIF1)==SET)//DMA2_Steam1,传输完成标志{  DMA_Cmd(DMA2_Stream1, DISABLE);	DMA_ClearFlag(DMA2_Stream1,DMA_FLAG_TCIF1);//清除传输完成中断/* 摄像头获取照片数据完毕,在这里添加操作代码 *//* 数据获取标志ov_rev_ok置位,在main函数中操作 */ov_rev_ok= 1;datanum++;}    											 
} 

注意点

在之前驱动摄像头的过程中,一些驱动难点:

  1. OV7670接口上的XCLK必须要接,这里用的是STM32F4分频输出MCO1,这里的分频系数要调试好,太高太低都不合适,代码定位在sccb.c的32行RCC_MCO1Config函数;
  2. OV7670的寄存器要配置正确,一些关于分频的寄存器要特别注意,在文件ov7670config.h中。
  3. OV7670_Window_Set用来裁剪照片的尺寸,正常的QVGA分辨率320*240,一个数组在STM32F4里放不下,可以用函数裁剪成小一点的尺寸存入数组用来传输数组。

小结:对于驱动摄像头OV7670解释了大概的思路,实际移植过程中会有很多改参数,调试的不过,需要自己对着数据手册耐心探索一下,不过过程不变其中。
接下来就把OV7670移植到家庭IOT监测工程中,将原本RGB565的照片数据转换成bmp数据上传到ONENET平台,达到监测的目的,加油,共勉~


http://www.ppmy.cn/news/291937.html

相关文章

Jetson nano配置排坑系列

Jetson nano配置排坑系列 烧写镜像 利用balenaEtcher将镜像文件~~&#xff08;使用官方镜像&#xff0c;下载速度也够快&#xff0c;毕竟官方的更保险&#xff09;nv-jetson-nano-sd-card-image-r32.4.2.zip~~&#xff08;踩坑系列一&#xff1a;tm的&#xff0c;垃圾官方&am…

Jetson nano 配置远程桌面

本文将介绍如何实现Windows远程连接Jetson nano桌面。 一.环境介绍 Jetson nano官方镜像&#xff08;JetPack 4.2&#xff09;&#xff0c;已更新软件下载源&#xff0c;已更新系统。 Jestson nano官方镜像下载地址。 更新软件源命令&#xff1a;sudo apt update 更新系统命…

树莓派摄像头远程拍照及传输

树莓派摄像头远程拍照及传输 文章目录 树莓派摄像头远程拍照及传输前言一、如何调用树莓派摄像头二、远程控制摄像头1、mqtt介绍2.使用mqtt 前言 树莓派是一种只有信用卡大小的微型电脑&#xff0c;携带方便。树莓派功能齐全&#xff0c;体积虽小&#xff0c;但是却有着齐全的…

小米12sultra支持ip68级防水吗 小米12sultra有光学变焦吗

在即将发布的小米手机中&#xff0c;最受大家欢迎的&#xff0c;肯定是“小米12sultra”&#xff0c;作为顶级配置的小米手机&#xff0c;在各个方面都十分强大&#xff0c;但有部分功能方面&#xff0c;还有网友不清楚&#xff0c;那么&#xff0c;小米12sultra支持ip68级防水…

linux机器切换IP实现HTTP代理

要实现HTTP代理&#xff0c;需要在Linux机器上安装并配置Squid代理服务器。以下是在Linux机器上切换IP实现HTTP代理的步骤&#xff1a; 1. 安装Squid代理服务器 在Linux机器上使用以下命令安装Squid代理服务器&#xff1a; sudo apt-get install squid 2. 配置Squid代理服务器…

vue3动态路由刷新后空白或者404

1.问题&#xff1a; 在使用beforeEach 进行拦截路由采用动态路由时&#xff0c;页面刚初始化时路由正常跳转但页面刷新后出现空白或者404 2.代码拦截 beforeEach((to, from, next) > {beforeEach((/logon, from, next) > {next() // 现在要去的地方不是 /home &#x…

Windows下安装python和pip

Windows下安装python和pip 1、安装python 注意&#xff1a;windows10 安装时强烈建议不用使用 Windows Store 安装。避免后期python运行时牵扯权限相关问题。 具体步骤&#xff1a; 1、前往python官网下载windows python 安装包 下载文件 2、双击运行安装&#xff08;强力…

100多的ipad触控笔好用吗?ipad可以用的手写笔推荐

随着IPAD的普及&#xff0c;一些学习党已经从传统的纸质教学走向了无纸化教学。所以&#xff0c;本来就是苹果品牌专利的电容笔&#xff0c;现在更是成为了炙手可热的产品&#xff0c;很多人都对这款售价近千元的电容笔充满了好奇。我认为&#xff0c;对于职业画师来说&#xf…