首页 > 编程知识 正文

stm32做摄像头应用,ov7725摄像头中文资料

时间:2023-05-06 11:19:02 阅读:112424 作者:4481

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

材料准备:

STM32F4标准工程: stm32f407自制标准工程(STM32F4标准工程) git仓库地址(STM32F4摄像头测试工程)中包含ov7670驱动程序文件、STM32F4摄像头测试工程, 上位机测试软件(stm32f4摄像头测试最后工序) git仓库地址)摄像头OV7670硬件连接和接口这里使用的模块是没有ov 7670 FIFO的版本,使用STM32F407的DCMI DMA进行数据

相机与STM32F4的连接图:

打开测试摄像机OV7670驱动KeilSTM32f4标准项目,在其中添加代码,然后单击测试摄像机OV7670 :

将准备材料测试过程中的相机驱动文件夹(ov7670 )复制到stm32f407标准过程dev文件夹下。 将文件夹ov7670添加到Manage Project Items中,并添加刚才复制的文件夹下的c文件。 在options-c/c包含路径添加dev下复制文件夹ov7670的路径。 必须修改ov7670.h和sccb.h文件中的相应IO端子,将其修改为自己的相应接口。 必须在评论中显示。 仔细检查ov7670.c和SCCB.c文件中的管脚初始化函数,确保正确初始化了相关的RESET、PWDN、sccb等管脚; 修改DCMI.c的My_DCMI_Init函数中dcmi关联管脚的初始化,使其与自己的管脚相对应。 向main.c添加头文件: # include ' ov 7670.h ' # include ' dcmi.h ' # include ' ov 7670 test.h '全局变量: extern u8ov _ rerevion 将代码添加到main函数中。 intmain(void ) ) {/* stm32系统配置(*/Sys_Config ); 新增//if (ov 7670 _ init )!=0) printf(ov7670initerror.rn ); }else{OV7670_USART_Init (; }while(1) {LED1_ON; dlay_ms(100; //添加新的if(ov_rev_ok ) Shanwai_sendcamera ) camera_buffer、PIC_WIDTH、PIC_HEIGHT; ov_rev_ok=0; (else ) dcmi_start ); (}LED1_OFF; dlay_ms(100; }编译通过后,烧写入STM32F4,首先观察Printf串行打印,是否有错误信息? 将串行端口2连接到PC,打开山外多功能调试助手-智能汽车助手:选择相应的com端口,修改波特率以使最大值与代码匹配,宽度为代码ov 7670.h-pic _ www 等待图像显示在图像区域中。 图:

相机OV7670代码分析现在分析OV7670的代码,先看看代码流程图:

查看几个重要函数:

ov7670_initU8ov7670_init(void ) {u16 i=0; u16 reg=0; /* RESET/PWDN引脚初始化*/OV7670_RST_PW_Init (; OV7670_PWDN_L; //poweronDelay_ms(100; OV7670_RST_L; 重置//ov7670delay_ms(100 ); OV7670_RST_H; //复位结束/* SCCB端子的初始化*/SCCB_Init (; 初始化SCCB的IO端口sccb _ wr _ reg (0x 12,0x 80 )//软复位ov7670delay_ms(50; reg=sccb_rd_reg(0x1c ); //读取制造商ID前8位reg=8; reg|=sccb_rd_reg(0x1d ); //读取制造商ID的后8位IF(REG )!=ov7670_mid((printf ) (r(nmid:%d(r(n ),reg ) ); 返回1; }reg=sccb_rd_reg(0x0a ); //读取制造商ID前8位reg=8; reg|=sccb_rd_reg(0x0b ); //读取制造商ID的后8位IF(REG )!=ov 7670 _ PID (printf (hid : % drnrn (,reg ) ); 返回2; 初始化并配置OV7670寄存器,QVGA分辨率(320*240 ) for ) I=0; Isizeof(ov7670_init_reg_TBL )/sizeof ) ov7670_init_reg_TBL[0]; I ) sccb _ wr _ reg (ov 7670 _ 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 ((uint 32 _ t ) camera _ buffer,sizeof ) camera _ bu buffer //ok } DMA2_ stream1_ irqhandlervoiddma2_ stream1_ IRQ handler (void ) if(DMA_GetflagStatus ) DMA2_ stream1DMA //传输完成中断的清除//*相机获取照片数据已完成。 在此添加操作码//*数据获取标志ov_rev_ok集,并使用main函数操作*/ov_rev_ok=1。 数据序列; }注意事项是,在以前驱动相机时,存在一些驱动上的难点:

OV7670接口的XCLK必须连接。 这里使用的是STM32F4分频输出MCO1。 这里的分频系数必须调试,过高或过低都不合适。 代码位于sccb.c的32行RCC_MCO1Config函数中; OV7670的寄存器必须正确配置。 一些有关分频的寄存器需要特别注意。 位于文件ov7670config.h中。 OV7670_Window_Set用于裁剪照片大小,正常QVGA分辨率为320*240,一个数组不能容纳在STM32F4中,可以用函数裁剪为稍小的大小,存储在数组中用于传输数组总结:虽然对驱动摄像头OV7670的大致思路进行了介绍,但在实际移植过程中经常会改变参数,需要调试,自己去数据手册耐心探索,过程不会改变。

然后将OV7670移植到家庭IOT监测工程,将RGB565的照片数据转换为bmp数据上传到ONENET平台,达到监测的目的。 请加油。 学习~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。