基于zynq7100的OV5640摄像头照相机实验,提供工程源码和技术支持

news2025/3/2 1:32:35

目录

  • 1.设计架构
  • 2.工程简介
  • 3.zynq配置
  • 4.sd卡文件系统FATFS配置
  • 5.sd卡文件系统FATFS读写测试
  • 6.OV5640摄像头显示测试
  • 7.OV5640摄像头循环拍照测试
  • 8.OV5640摄像头按键拍照测试
  • 9.上板调试
  • 10.福利领取

1.设计架构

设计框图如下:
在这里插入图片描述
采用Xilinx官方推荐的VDMA架构实现图像缓存和显示,除OV5640摄像头采集和HDMI输出外,其他ip均采用Xilinx官方IP实现。
这里说明一下:
OV5640摄像头图像数据经VDMA三帧缓存后有2路输出
1路输出HDMI显示器显示;
1路通过FATFS文件系统写入sd卡中存放,存放的数据格式位bmp图片;

2.工程简介

开发板的zynq主控是zynq7100,工程实现功能如下:
1.实现OV5640摄像头HDMI输出;
2.实现sd卡FATFS文件系统简单读写测试;
3.实现OV5640摄像头循环拍照,3秒拍摄一张图片;
4.实现OV5640摄像头按键拍照,板载PS侧按键按一下拍照;
工程BD部分如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程SDK代码架构如下:
在这里插入图片描述
SDK代码说明:
设置了2个宏定义:

//#define FATFS_TEST
//#define KEY_CAMERA

#define FATFS_TEST:FATFS文件系统测试:
默认为注释掉,程序执行摄像头循环拍照功能;
取消注释则程序执行FATFS文件系统读写测试;
#define KEY_CAMERA:摄像头按键拍照功能;
默认为注释掉,程序执行摄像头循环拍照功能;
取消注释则程序执行摄像头按键拍照功能;

3.zynq配置

zynq配置这里主要是要使能i2c外设和sd卡外设,i2c外设使能是为了配置OV5640摄像头,sd卡外设使能则是为了存放拍摄的照片,除此之外,还要使能一个mio,因为mio连接了一个PS侧的按键,后面要依靠此按键来触发拍照;
在这里插入图片描述
在这里插入图片描述

4.sd卡文件系统FATFS配置

在嵌入式领域,sd卡可以跑FATFS文件系统,Xilinx的SDK开发环境已经集成了FATFS库,所以我们只需在使用前配置一下就可以了,非常方便,设置方法如下:
1.vivado导出比特流并启动sdk;
2.sdk新建一个工程;
3.接下来添加 FATFS 库。需要注意的是,先关闭 system.mss 的界面,再添加 FATFS库,否则有可能导致 FATFS 库添加失败。
在这里插入图片描述
system.mss 界面关闭后,右击 micro_sd_rw_bsp,选择“Board Support Package Setting”。
在这里插入图片描述
在弹出的界面中勾选“xilffs”,xilffs 即为 FATFS 库
在这里插入图片描述
勾选后,会在左侧 Overview 的 standalone 一栏出现 xilffs,点击 xilffs。可以看到 use_lfn 的默认设置为
false,即不使能。use_lfn 用于设置是否使能长文件名以及文件名的小写字母,这里将 use_lfn 设置为 true,
点击“OK”按钮完成设置。
在这里插入图片描述
设置完成后,在 sd_rw_txt_bsp→ps_cortexa9_0→libsrc 一栏下,会多出 FATFS 的库函数。
在这里插入图片描述

5.sd卡文件系统FATFS读写测试

在摄像头拍照实验之前,需要先对FATFS文件系统进行测试,看是否在sd卡上能跑通;
测是方法如下:
第一步:在sd卡中新建一个txt文件;
第二步:新建的txt文件中写入一段测试字符串;
第三步:读出txt文件中上一步写入的测试字符串;
第四步:比较读写字符串内容是否完全一致;也可以拔出sd卡在电脑中查看内容;
在SDK中建立了sd读写的头文件和源文件,在源文件中含有读写测试的功能函数;
在进行sd卡文件系统FATFS读写测试之前,应在主函数中取消#define FATFS_TEST的注释:

#define FATFS_TEST
//#define KEY_CAMERA

写数据如下:

const char src_str[100] = "I love Xilinx FPGAs ~~~~~~~~~~~~"; //定义文本内容

下面给出读写测试函数源码;

int helai_sd_test(){
    int len;
    int i;
    char dest_str[100] = "";
    sd_mount();           //挂载SD卡
    len = strlen(src_str);         //计算字符串长度
    sd_write_data(FILE_NAME,(u32)src_str,len);	//SD卡写数据
    sd_read_data(FILE_NAME,(u32)dest_str,len);	//SD卡读数据
    //比较写入的字符串和读出的字符串是否相等
   //for(i=0;i<len;i++){
   // 	xil_printf("read data =%c\r\n",dest_str[i]);
   // }
    if (strcmp(src_str, dest_str) == 0) xil_printf("src_str is equal to dest_str,SD card test success!\n");
    else xil_printf("src_str is not equal to dest_str,SD card test failed!\n");
    return 0;
}

测试结果:
串口观测读写内容的对比结果为正确:
在这里插入图片描述
拔出SD卡用读卡器到电脑端直接查看内容:
在这里插入图片描述
在这里插入图片描述

6.OV5640摄像头显示测试

为了保证拍照的正确性,调试拍照之前,必须保证图像数据采集的正确,所以直接接上显示器输出,分辨率位720P,这部分由VDMA配置;

7.OV5640摄像头循环拍照测试

这部分功能为实现OV5640摄像头循环拍照,3秒拍摄一张图片;
bmp图片有固定的数据头,所以直接在程序中定义该部分,如下:

//BMP图片文件头
u8 bmp_head[54] = {
     0x42,0x4d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x36,0x0,0x0,0x0,0x28,0x0,
	 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x18,0x0,0x0,0x0,
	 0x0,0x0,0x0,0x0,0x0,0x0,0xc4,0xe,0x0,0x0,0xc4,0x0e,0x0,0x0,0x0,0x0,
	 0x0,0x0,0x0,0x0,0x0,0x0 };

随后就是将图像的rgb数据部分和数据头部分一起写入sd卡中形成bmp图片;
直接给出主函数代码:

void main(){
	XGpioPs_Config_key=XGpioPs_LookupConfig(GPIO_KEY);
	XGpioPs_CfgInitialize(&XgpioPS_key, XGpioPs_Config_key, XGpioPs_Config_key->BaseAddr);
	XGpioPs_SetDirectionPin(&XgpioPS_key, 51, 0);
	// Initialize OV5640 regesiter
	int  rd_index;				//VDMA读通道操作的帧缓存编号
	unsigned int rd_fram_addr;	//VDMA读通道操作的帧缓存地址
	I2C_config_init();
	helai_vdma();
#ifdef FATFS_TEST
	helai_sd_test();
	while(1);
#else
	//最后一个参数表示清零的字节数,由于RGB888数据格式占用3个字节,因此最后乘以3
	memset(0x01000000,0,1280*720*3*3);
	Xil_DCacheFlush();
	//根据VDMA显存大小给BMP文件头赋值
	*bmp_width  = 1280;
	*bmp_height = 720;
	*bmp_size   = 1280*720*3;
	*bf_size    = *bmp_size + 54;
	f_mount(&fatfs,"",1);	//挂载文件系统
	while (1){
		#ifdef KEY_CAMERA
		int key;
		key=XGpioPs_ReadPin(&XgpioPS_key, 51);
		if(key==0){
			usleep(20000);
			if(key==0){
				printf("capture picture\n");
				rd_index = XAxiVdma_CurrFrameStore(&vdma, XAXIVDMA_READ);	//获取当前读通道操作的帧缓存编号
				printf("current read frame is %d\n",rd_index);
				XAxiVdma_StartParking(&vdma, rd_index, XAXIVDMA_READ);	//读通道驻停在当前帧
				rd_fram_addr = 0x01000000 + 1280*720*3*rd_index;	//并获取当前帧的起始地址
				memcpy((void *)bmp_addr,(void *)rd_fram_addr,1280*720*3);	//将当前帧的图像拷贝到抓拍图片缓存区域
				XAxiVdma_StopParking(&vdma, XAXIVDMA_READ);	//结束读通道驻停过程,继续在多帧之间进行切换
				write_sd_bmp((u8 *)bmp_addr);	//将抓拍图片缓存区域中的图像以BMP格式写入SD卡
				pic_cnt++;	//BMP图片编号累加
			}
		}
		#else
		printf("capture picture\n");
		rd_index = XAxiVdma_CurrFrameStore(&vdma, XAXIVDMA_READ);	//获取当前读通道操作的帧缓存编号
		printf("current read frame is %d\n",rd_index);
		XAxiVdma_StartParking(&vdma, rd_index, XAXIVDMA_READ);	//读通道驻停在当前帧
		rd_fram_addr = 0x01000000 + 1280*720*3*rd_index;	//并获取当前帧的起始地址
		memcpy((void *)bmp_addr,(void *)rd_fram_addr,1280*720*3);	//将当前帧的图像拷贝到抓拍图片缓存区域
		XAxiVdma_StopParking(&vdma, XAXIVDMA_READ);	//结束读通道驻停过程,继续在多帧之间进行切换
		write_sd_bmp((u8 *)bmp_addr);	//将抓拍图片缓存区域中的图像以BMP格式写入SD卡
		pic_cnt++;	//BMP图片编号累加
		sleep(3);
		#endif
	}
#endif
}

测试完成后,拔出SD卡用读卡器到电脑端直接查看内容:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.OV5640摄像头按键拍照测试

这部分功能为实现OV5640摄像头按键拍照,板载PS侧按键按一下拍照;
在使用之前,应在主函数中取消#define KEY_CAMERA的注释:

//#define FATFS_TEST
#define KEY_CAMERA

9.上板调试

开发板:zynq7100开发板;
开发环境:vivado2019.1;
输入:OV5640摄像头,720P,RGB888格式;
输出:HDMI输出,SD卡bmp图片;
如下:
在这里插入图片描述

10.福利领取

可私,可得到工程的某度网盘链接,不要发邮箱地址,工程太大发不了邮箱;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TiDB丨一次TiDB GC阻塞引发的“惨案”......

前不久&#xff0c;从项目一线同学得到某集群的告警信息&#xff0c;某个时间段 TiDB duration 突然异常升高&#xff0c;持续时间6小时左右&#xff0c;需要定位到具体原因。 于是乎&#xff0c;我们就来一场关于TiDB GC阻塞的排查...... 分析过程 第一招 初步判断 既然…

Docker+nginx在CVM的机器远程发布hellogin

有两种方式&#xff0c;一种通过docker容器安装&#xff0c;一种是直接安装, 这里我们通过docker服务安装 常用操作 images是查询当前机器上所有的镜像有哪些 docker images删除镜像 docker rmi [MAGE ID ]可以查当前运行中的容器 docker ps -a开始/停止/删除容器 docker…

动态树的最值

一 问题描述 一棵树有 N 个节点&#xff0c;每个节点都有一个权值 Wi &#xff0c;有 4 种操作。 ① 1 x y &#xff0c;在两个节点 x、y 之间添加一条新边。因此&#xff0c;在这种操作之后&#xff0c;两棵树将连接成一棵新树。 ② 2 x y &#xff0c;在树集合中找到包含节…

LeetCOde-剑指46-把数字翻译成字符串

1、动态规划法 我们通过观察可以发现&#xff0c;假如我们使用数组dp[i]dp[i]dp[i]来记录前iii位可能构成的字符串个数&#xff1a;1、当新加入的第i1i1i1位和第iii位能够构成一个大于9小于26的数字时&#xff0c;dp[i1]dp[i]dp[i−1]dp[i1]dp[i]dp[i-1]dp[i1]dp[i]dp[i−1]&a…

容器化部署(k8s)任务调度平台xxl-job(部署过程及踩坑问题记录)

文章预览&#xff1a;1 部署过程&#xff08;下方ip代表服务器的ip哈&#xff09;1.1 制作服务打包镜像DockerFile1.2 制作执行脚本run.sh1.3 jar包上上传1.4 kuboard创建----配置信息2 踩坑问题记录2.1 日志抛出异常2.2 原因分析2.3 过程分析及解决2.4 执行调度测试导入sql等过…

Baklib|SaaS产品,实现企业流程数字化

正如许多科技潮流一样&#xff0c;“SaaS”这个词也逐渐成为企业经理们谈论的话题。然而&#xff0c;如果您对“SaaS”一无所知&#xff0c;您可能会感到困惑并容易忽略它。那么&#xff0c;什么是“SaaS”&#xff1f;它的优点是什么&#xff1f;它如何帮助企业实现数字化转型…

SSM+VUE+ElementUI实现宠物领养系统,期末大作业

SSMVUEElementUI实现宠物领养系统 系统角色 领养人&#xff0c;管理员 系统功能 本系统的功能主要分为四大模块&#xff1a; 领养人用户模块&#xff1a;注册、领养人登录、申请领养、查看小动物信息、发布留言领养机构员工用户模块&#xff1a;领养机构员工登录、增加小动…

地平线开发者社区真心话大冒险,邀你闯关!

Hello&#xff01; 各位初次见面的萌新和久经沙场的社牛 目前开发者社区已成立两年有余 感谢大家一路上的支持和理解 今天&#xff0c;我们也准备了一些小礼品 希望倾听大家作为用户和开发者的真心话 同时&#xff0c;也欢迎初次见面的萌新们一同冒险 期待陪伴大家走过更…

Protect Privacy from Gradient Leakage Attack in Federated Learning

wangjunxiao/GradDefense: Defense against Gradient Leakage Attack (github.com) Summary 针对DGA和DIA攻击&#xff0c;提出了一个轻量、保证训练准确性、够用的的防御机制。防御机制主要包括随机layer添加扰动&#xff0c;然后进行梯度补偿来减少噪声对模型准确性的影响。…

CORS处理跨域问题

“前后端分离的项目必然会遇到一个典型的问题——跨域问题。” 跨域 要解决跨域问题&#xff0c;首先得知道什么是跨域&#xff1f; 首先&#xff0c;跨域是访问的域名或IP、端口三者有一不同都属于跨域。&#xff08;注意请求路径不是&#xff09;&#xff0c;即使在本地测试&…

【计算机网络】学习笔记--第一章

【计算机网络】学习笔记--第一章基本概念端系统之间的通信客户-服务器方式&#xff08;C/S方式&#xff09;对等连接方式&#xff1a;三种交换方式电路交换&#xff08;Circuit Switching&#xff09;分组交换&#xff08;Packet Switching&#xff09;报文交换&#xff08;Mes…

centos7 安装与卸载 Mysql 5.7.27(详细完整教程)

目录 卸载 安装 卸载 1、关闭MySQL服务 systemctl stop mysqld2、使用 rpm 命令查看已安装的安装包 [nameVM-20-12-centos mysql1]$ rpm -qa|grep mysql 3、使用yum卸载安装的mysql [nameVM-20-12-centos mysql1]$ sudo yum remove mysql mysql-server mysql-libs mysql…

【LeetCode每日一题:775.全局倒置与局部倒置~~~维护前缀最大值】

题目描述 给你一个长度为 n 的整数数组 nums &#xff0c;表示由范围 [0, n - 1] 内所有整数组成的一个排列。 全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目&#xff1a; 0 < i < j < n nums[i] > nums[j] 局部倒置 的数目等于满足下述条件的下标 …

Air780E连接点灯科技-LuatOS

前面发了腾讯云点灯以后&#xff0c;有朋友提到了点灯科技&#xff0c;人家都叫点灯科技了&#xff0c;那咱们学点灯必须连一下试试呀。本文将记录如何将设备连接点灯云平台&#xff0c;并通过手机进行远程控制 先上成果演示 一、点灯云准备 下载点灯科技的app-blinker&#…

Offsets 获取该行的起始索引 start=offsets (x)

获取数据列的第 x 行&#xff0c;通过 Offsets 获取该行的起始索引 startoffsets (x) 和下一行的起始索引 endoffsets (x1)&#xff0c;然后使用这两个索引通过 Bytes 获取具体数据对应的字节流 bytes.slice (start,end)&#xff0c;最后按照字段类型做相应的转换即可。 注&am…

QGC二次开发基础

文章目录 前言一、添加文件到QGC工程二、添加界面三、QML和C++交互四、信号与槽五、测试前言 QGC 4.2.4 一、添加文件到QGC工程 在qgroundcontrol/src目录下创建SimpleTest文件夹 在文件夹中创建SimpleTest.cpp、SimpleTest.h和SimpleTest.qml三个文件 在qgroundcontrol.p…

锁竞争导致的慢sql分析

线上在同步用户时&#xff0c;经常出现简单sql的慢日志。根据方法找到代码&#xff0c;发现方法内使用redisson进行锁操作&#xff0c;waiTime和leaseTime都为3秒,数据库操作比较简单&#xff0c;只是一个简单的用户更新操作。代码简化后如下 Override Transactional(rollback…

客流分析统计摄像头可定制算法程序自动判断识别提醒

客流分析统计摄像头是一个专门为商业零售业企业开发的智能客流量统计分析系统。客流统计分析系统能实时、动态、准确、连续地记录着经营场地的客流的数据信息&#xff0c;既有当前客流又有历史客流&#xff0c;既有不同时段的&#xff0c;又有不同区域客流数据。 客流分析统计摄…

【论文】Poly-yolo: 改进anchor分配问题

文章目录Poly-yolo: higher speed,more precise detection and instance segmentation for yolov31 修改了骨干网络增加CE模块2 重写标签3、修改了输出层3.1 修改细节3.2 修改目的&#xff1a;改进anchor分配问题4 检测多边形 Instance segmentation with Poly-YOLO4.1 The pri…

【Pytorch with fastai】第 9 章 :表格建模深入探讨

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…