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

2023-10-27

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

材料准备:


摄像头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 ON
	delay_ms(100);
	OV7670_RST_L;	//复位OV7670
	delay_ms(100);
	OV7670_RST_H;	//结束复位 
	
	/* SCCB引脚初始化 */
	SCCB_Init();        		//初始化SCCB 的IO口	
	SCCB_WR_Reg(0X12, 0x80);	//软复位OV7670
	delay_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平台,达到监测的目的,加油,共勉~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

家庭IOT监测之摄像头OV7670测试 的相关文章

  • 两款主流摄像头OV7620与OV7670 By Demok

    如今 xff0c 市场上提到可以应用在智能车上的摄像头 xff0c 多如牛毛 到底那一款最适合用在智能车上呢 xff0c 这里DEMOK选取了2款典型的摄像头OV7670与OV7620 xff0c 从其特性和性能等角度 xff0c 剖析摄像
  • STM32F4 使用结构体配置功能

    1 IIC配置 void IIC Mode Config void I2C InitTypeDef I2C InitStructure I2C InitStructure I2C Mode 61 I2C Mode I2C IIC模式 I2C
  • STM32F4串口通信(UART)详解

    UART串口通信 我们在生活中处处都会接触到或者是用到通信 QQ 微信 电话 这些都是最常见的人与人之间远程无线通信的方式 那么也有像红外遥控 蓝牙数据传输等器件或硬件之间的通信 这些通信方式都有一些共同点 无线 易受干扰 信号变差 等 而
  • STM32F4系列+FreeRTOS+USB方式驱动有方4G模块

    USB方式驱动有方4G模块 参考博客如下 xff1a 1 https blog csdn net ZCShouCSDN article details 78936456 2 https blog csdn net gyzw mx artic
  • STM32F4 DMA

    STM32F4有2个DMA xff0c 每个DMA控制器有8个数据流 xff0c 每个数据流有多达8个通道 xff0c 但是DMA1 控制器 AHB 外设端口与 DMA2 控制器的情况不同 xff0c 不连接到总线矩阵 xff0c 因此 x
  • STM32F4 SPI RX/TX DMA 读写FLASH数据

    STM32 使用DMA读写FLASH数据需要注意以下几点 xff1a 1 SPI全双工模式下 xff0c 无论读写FLASH数据均需要同时使能RX TX DMA 2 写数据时回读数据应当丢弃 xff0c 读数据时应当发送0xff来启动SPI
  • STM32F4-UartPrint

    串口的Printf打印 1 STM32CubeMx配置 xff1a 2 生成代码后 xff0c usart c里增加代码 USER CODE BEGIN 1 int fputc int ch FILE f while HAL UART GE
  • STM32F4 UART基础(HAL库)

    文章目录 概述 96 UART 96 初始化 96 UART 96 参数初始化 96 UART 96 句柄 96 UART 96 初始化结构体 96 UART 96 参数初始化函数 96 UART 96 时钟初始化 96 UART GPIO
  • stm32f4串口接收与发送

    之前有写一篇stm32f1串口接收与发送的文章 xff0c stm32f4与f1只有配置上的一点不同 xff0c 今天把f4的串口接收与发送代码分享一下 详细解释推荐大家看f1那篇 xff0c 都是一样的 xff0c stm32f1串口发送
  • STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强

    ms5611是同时支持I2C和SPI通信协议的气压计芯片 已经很普遍的被用在飞行器控制板上作为高度传感器 开发过stm32的朋友都知道它的硬件I2C是由bug的 xff0c 一般使用的都是自己编写的软件I2C通信协议 但是其硬件SPI通信却
  • 第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

    第45章 DCMI OV2640摄像头 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege
  • STM32F407的CAN通信实验CAN1CAN2的设置

    CAN2的初始化参照上一篇博文就OK了 需要修改的地方 配置过滤器 CAN FilterInitStructure CAN FilterNumber 14 那为什么要修改额 查datasheet 双 CAN CAN1 主 bxCAN 用于管
  • WVP-PRO+ZLMediaKit搭建GB28181视频平台(linux详细教学)

    文章目录 一 安装WVP PRO 1 源码下载 链接内任选其一 https doc wvp pro cn 2 修改配置 仔细查看每行都有说明注释 3 编译前端页面 4 打包为jar 上传到服务器 二 安装ZLMediaKit 1 前置环境安
  • 撸狗初体验

    直接上视频听我 BB https www bilibili com video av75675708 下面开始编故事 某个周末 走在去加班的路上 脚底突然被某个东西咯噔一下 抬脚一看 竟然是 捡起来一看 哈士奇 哈士奇 哈士奇 竟然是 DF
  • 家庭IOT监测之摄像头OV7670测试

    本篇目标 使用STM32F407驱动摄像头OV7670 并上位机显示照片结果 材料准备 STM32F4标准工程 stm32f407自建标准工程 stm32f4标准工程 git仓库地址 STM32F4摄像头测试工程 里面包含ov7670驱动文
  • stm32f407zgt6的pdr_on引脚怎么接

    原文链接 https www amobbs com thread 5495105 1 1 html dsign c6460fe9 407的100脚封装没有这个PDR ON 就是VSS 在引脚分布图中为pdr on 但实际量pdr on对VS
  • OpenCV学习记录之摄像头调用

    关于opencv调用摄像头的问题主要是因为摄像头的打开有延时 在显示图像前 要用if语句判断图像是否存在 否则会报错 具体的 教程里的源程序 将if条件句里 break去掉 并增加else语句 include
  • MTF浅谈概论,SFR原理,CTF,各自优缺点

    MTF浅谈概论 SFR原理 CTF 各自优缺点 好像很多人很多地方 不管什么样的清晰度测试都通通叫MTF 比如用线对的方式测的对比度也叫MTF SFR 也叫MTF 其实如果将MTF作为一个统称概念不是不行 但容易造成很多人混淆 概念模糊 尤
  • 臻识车牌识别摄像头对接

    一 臻识车牌识别摄像头 1 非常有用的官方代码 内部有TCP HTTP等协议 2 官方常见问题 3 官方下载专区 二 http对接例子 1 自己使用java mock 模拟后台服务 你会用到的配置文件 java jar moco runne
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了

随机推荐

  • clickhouse优化最佳实践

    clickhouse在易企秀数据仓库项目中已投入使用两年 主要为内部用户提供快速查询和多维分析的能力 希望你在业务当中遇到的性能问题 在这里都能得到解决 Clickhouse堪称OLAP领域的黑马 最近发布的几个版本在多表关联分析上也有了极
  • 有什么事在Linux上顺理成章,在Windows就令人费解?

    Linux与Windows都是十分常见的电脑操作系统 相信大家对它们二者都有所了解 在我们的使用过程中 是否有遇到这种情况 在Linux上顺理成章 换到Windows上就令人费解 文章目录 一 介绍 2 1 Linux系统 1 2 Wind
  • c# 已知文件路径,遍历文件夹下的.lnk文件(其他类型的文件也可同样的方法操作)

    遍历文件夹下的 lnk文件 public static string ForeachFiles lnk string FilePath string files Directory GetFiles FilePath lnk SearchO
  • vue webpack3 升级webpack4

    vue webpack3 升级webpack4 据说webpack3 比webpack4 编译速度将近快了60 80 成功升级之后 于是来记录下 项目主要是vue 2 5 9 webpack 4 10 2 webpack dev sever
  • 支付宝支付回调

    1 支付宝回调地址设置在上一篇博客已经记录 地址 https blog csdn net qq 38669394 article details 106671410 2 支付宝回调方法 最主要两点 一个是如何接受参数 另一个是验签 这里需要
  • 软件工程师的衰落与程序员的崛起

    全文共4711字 预计学习时长14分钟 来源 cu manmanbuy 我周围大多数人都是软件工程师或计算机科学家 大多经验丰富且接受过严格的计算机科学教育 当然 这只能成就一个计算机科学 却不一定能成就编程 许多经验丰富的同事都痛惜年轻同
  • 用secureCRT串口工具发送hex字符串的方法

    最近工作中 遇到了需要在串口工具发送hex字符 直接在secureCRT的 交互窗口输入是不行的 我需要输入的hex字符串为 FEFE010601F9 解决方法如下 1 下载并安装winhex 下载地址 https www onlinedo
  • 怎么样使用Navicat for MySQL 导出mysql中的数据和将sql数据库文件导入到mysql数据库中

    很久没有使用navicat for mysql 了 一些基本的操作都遗忘 为避免下次再出现这种情况 先记下吧 将mysql数据文件导入到数据库中 1 在navicat 中创建一个mysql数据库链接 填写端口 用户名 密码 2 创建数据库
  • 《Hadoop权威指南》书摘-MapReduce概述

    转载请注明出处 独立博客 http wangnan tech 简书 http www jianshu com u 244399b1d776 知乎 https zhuanlan zhihu com c 121958856 MapReduce是
  • 技能树-网络爬虫-selenium

    文章目录 前言 一 selenium 二 selenium 测试用例 总结 前言 大家好 我是空空star 本篇给大家分享一下 技能树 网络爬虫 selenium 一 selenium Selenium是web自动化测试工具集 爬虫可以利用
  • Unity_获取当前点击物体的名字(获取名字

    获取当前点击物体的名字 返回一个string类型的值 EventSystem current currentSelectedGameObject name
  • Ant Design Blazor 发布 0.13.0,正式支持.NET 7!

    时隔3个月 Ant Design Blazor 发布新功能版本 0 13 0 并正式支持 NET 7 大家快去访问 antblazor com 体验吧 新增 NET 7 目标框架支持 2810 ElderJames 重构 Mentions
  • 问题:USART无法进入接收中断

    原因1 时钟TIM的超时配置不正确 时间太短 解决1 将时钟TIM超时时间加长 原因2 接收中断未使能 解决2 将接收中断ENABLE
  • Vue-移动端rem适配

    1 rem 使用 rem 单位可以让设计更加灵活 能够控制元素整体放大缩小 而不是固定大小 rem单位基于 html 元素字体大小 2 适配工具 lib flexible postcss px2rem exclude 3 lib flexi
  • Google Play 上架总结(二)Google账户关联详解

    近期 本人在 App 上架Google Play 过程中 频繁遇到账号被关联封禁 在踩过很多坑后 我觉得有必要总结一下 给其它朋友作为参考 一 Google 账户关联是指什么 账户关联是就是当Google开发者账号因为各种原因被封停了 此时
  • Java制作报表系统流程_finereport报表制作详细过程

    一般来说 一个完整的报表设计流程 大体分为如下几个步骤 1 打开设计器 2 配置数据源 3 新建报表 4 配置私有数据源 5 报表设计 6 预览报表 7 发布报表 第一部分 配置数据源 打开报表设计器 在设计器最上方的菜单栏当中 选择服务器
  • Redis时单线程设计的,为什么还这么快

    单线程设计的考虑 Redis采用单线程好处在于避免了多线程对数据竞争的问题 加锁的问题 上下文切换的问题 据官方解释 redis的瓶颈不在cpu 而在内存或者网络的带宽 综合考虑然后就采用了单线程 Redis的性能非常高 每秒可以承受10W
  • a-cascader编辑绑定值数据变化,但页面dom不回显不更新问题($set用法)

    问题 编辑时 级联组件绑定数据变化 的dom不进行更新 原因 引用值类型 对象或数组 动态添加或删除某一个属性值 需要使用this set 或者 Object assign 不然数据触发不到getter和setter 对from直接赋值不会
  • Golang知识点五、数据类型

    数据类型 从本篇文章开始 记录Golang数据类型相关的内容 数据类型相关的知识点包括slice map string三个部分 1 切片 1 1 从数组说起 数组是具有固定长度具有零个或者多个相同数据类型元素的序列 由于数组长度固定 在Go
  • 家庭IOT监测之摄像头OV7670测试

    本篇目标 使用STM32F407驱动摄像头OV7670 并上位机显示照片结果 材料准备 STM32F4标准工程 stm32f407自建标准工程 stm32f4标准工程 git仓库地址 STM32F4摄像头测试工程 里面包含ov7670驱动文