ov5640摄像头使用心得
配置总共分以下几步:
一:硬件初始化
OV5640_HW_Init();
void OV5640_HW_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStruct;/***DCMI引脚配置***//* 使能DCMI时钟 */RCC_AHB1PeriphClockCmd(DCMI_PWDN_GPIO_CLK|DCMI_RST_GPIO_CLK|DCMI_VSYNC_GPIO_CLK | DCMI_HSYNC_GPIO_CLK | DCMI_PIXCLK_GPIO_CLK|DCMI_D0_GPIO_CLK| DCMI_D1_GPIO_CLK| DCMI_D2_GPIO_CLK| DCMI_D3_GPIO_CLK|DCMI_D4_GPIO_CLK| DCMI_D5_GPIO_CLK| DCMI_D6_GPIO_CLK| DCMI_D7_GPIO_CLK, ENABLE);/*控制/同步信号线*/GPIO_InitStructure.GPIO_Pin = DCMI_VSYNC_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;GPIO_Init(DCMI_VSYNC_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_VSYNC_GPIO_PORT, DCMI_VSYNC_PINSOURCE, DCMI_VSYNC_AF);GPIO_InitStructure.GPIO_Pin = DCMI_HSYNC_GPIO_PIN ;GPIO_Init(DCMI_HSYNC_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_HSYNC_GPIO_PORT, DCMI_HSYNC_PINSOURCE, DCMI_HSYNC_AF);GPIO_InitStructure.GPIO_Pin = DCMI_PIXCLK_GPIO_PIN ;GPIO_Init(DCMI_PIXCLK_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_PIXCLK_GPIO_PORT, DCMI_PIXCLK_PINSOURCE, DCMI_PIXCLK_AF);/*数据信号*/GPIO_InitStructure.GPIO_Pin = DCMI_D0_GPIO_PIN ;GPIO_Init(DCMI_D0_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D0_GPIO_PORT, DCMI_D0_PINSOURCE, DCMI_D0_AF);GPIO_InitStructure.GPIO_Pin = DCMI_D1_GPIO_PIN ;GPIO_Init(DCMI_D1_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D1_GPIO_PORT, DCMI_D1_PINSOURCE, DCMI_D1_AF);GPIO_InitStructure.GPIO_Pin = DCMI_D2_GPIO_PIN ;GPIO_Init(DCMI_D2_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D2_GPIO_PORT, DCMI_D2_PINSOURCE, DCMI_D2_AF);GPIO_InitStructure.GPIO_Pin = DCMI_D3_GPIO_PIN ;GPIO_Init(DCMI_D3_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D3_GPIO_PORT, DCMI_D3_PINSOURCE, DCMI_D3_AF);GPIO_InitStructure.GPIO_Pin = DCMI_D4_GPIO_PIN ;GPIO_Init(DCMI_D4_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D4_GPIO_PORT, DCMI_D4_PINSOURCE, DCMI_D4_AF);GPIO_InitStructure.GPIO_Pin = DCMI_D5_GPIO_PIN ;GPIO_Init(DCMI_D5_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D5_GPIO_PORT, DCMI_D5_PINSOURCE, DCMI_D5_AF);GPIO_InitStructure.GPIO_Pin = DCMI_D6_GPIO_PIN ;GPIO_Init(DCMI_D6_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D6_GPIO_PORT, DCMI_D6_PINSOURCE, DCMI_D6_AF);GPIO_InitStructure.GPIO_Pin = DCMI_D7_GPIO_PIN ;GPIO_Init(DCMI_D7_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(DCMI_D7_GPIO_PORT, DCMI_D7_PINSOURCE, DCMI_D7_AF);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin = DCMI_PWDN_GPIO_PIN ;GPIO_Init(DCMI_PWDN_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = DCMI_RST_GPIO_PIN ;GPIO_Init(DCMI_RST_GPIO_PORT, &GPIO_InitStructure);/*PWDN引脚,高电平关闭电源,低电平供电*/GPIO_ResetBits(DCMI_RST_GPIO_PORT,DCMI_RST_GPIO_PIN);GPIO_SetBits(DCMI_PWDN_GPIO_PORT,DCMI_PWDN_GPIO_PIN);Delay(10);GPIO_ResetBits(DCMI_PWDN_GPIO_PORT,DCMI_PWDN_GPIO_PIN);//先拉低RST, 关闭电源10ms,然后打开电源, 等待10ms,此时复位完毕,然后RST拉高开始工作!Delay(10);GPIO_SetBits(DCMI_RST_GPIO_PORT,DCMI_RST_GPIO_PIN);/****** 配置I2C,使用I2C与摄像头的SCCB接口通讯*****//* 使能I2C时钟 */RCC_APB1PeriphClockCmd(CAMERA_I2C_CLK, ENABLE);/* 使能I2C使用的GPIO时钟 */RCC_AHB1PeriphClockCmd(CAMERA_I2C_SCL_GPIO_CLK|CAMERA_I2C_SDA_GPIO_CLK, ENABLE);/* 配置引脚源 */GPIO_PinAFConfig(CAMERA_I2C_SCL_GPIO_PORT, CAMERA_I2C_SCL_SOURCE, CAMERA_I2C_SCL_AF);GPIO_PinAFConfig(CAMERA_I2C_SDA_GPIO_PORT, CAMERA_I2C_SDA_SOURCE, CAMERA_I2C_SDA_AF);/* 初始化GPIO */GPIO_InitStructure.GPIO_Pin = CAMERA_I2C_SCL_PIN ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(CAMERA_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(CAMERA_I2C_SCL_GPIO_PORT, CAMERA_I2C_SCL_SOURCE, CAMERA_I2C_SCL_AF);GPIO_InitStructure.GPIO_Pin = CAMERA_I2C_SDA_PIN ;GPIO_Init(CAMERA_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);/*初始化I2C模式 */I2C_DeInit(CAMERA_I2C); I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStruct.I2C_OwnAddress1 = 0xFE;I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStruct.I2C_ClockSpeed = 400000;/* 写入配置 */I2C_Init(CAMERA_I2C, &I2C_InitStruct);/* 使能I2C */I2C_Cmd(CAMERA_I2C, ENABLE);Delay(50);
}
二:判断摄像头是否已经挂载
OV5640_ReadID(&OV5640_IDStruct);if(OV5640_IDStruct.PIDH == 0x56){printf("OV5640 IS MOUNTED!\r\n");}
三:颜色配置
void OV5640_RGB565Config(void)
{uint32_t i;/*摄像头复位*/OV5640_Reset();/* 写入寄存器配置 *//* Initialize OV5640 Set to output RGB565 */for(i=0; i<(sizeof(RGB565_Init)/4); i++){OV5640_WriteReg(RGB565_Init[i][0], RGB565_Init[i][1]);sensor_reg[i] = OV5640_ReadReg(RGB565_Init[i][0]);CAMERA_DEBUG("sensor_reg[0x%x]:%x-%x\n",RGB565_Init[i][0],RGB565_Init[i][1],sensor_reg[i]);}Delay_ms(500);if(img_width == 320)ImageFormat=BMP_320x240;else if(img_width == 640)ImageFormat=BMP_640x480;else if(img_width == 800)ImageFormat=BMP_800x480;switch(ImageFormat){case BMP_320x240:{for(i=0; i<(sizeof(RGB565_QVGA)/2); i++){OV5640_WriteReg(RGB565_QVGA[i][0], RGB565_QVGA[i][1]);}break;}case BMP_640x480:{for(i=0; i<(sizeof(RGB565_VGA)/2); i++){OV5640_WriteReg(RGB565_VGA[i][0], RGB565_VGA[i][1]);}break;}case BMP_800x480:{for(i=0; i<(sizeof(RGB565_WVGA)/2); i++) //?{OV5640_WriteReg(RGB565_WVGA[i][0], RGB565_WVGA[i][1]);}break;}default:{for(i=0; i<(sizeof(RGB565_WVGA)/2); i++){OV5640_WriteReg(RGB565_WVGA[i][0], RGB565_WVGA[i][1]);}break;}}
}
四:性能参数设置
void OV5640_USER_Config(void)
{ OV5640_FrameRate_Set(cam_mode.frame_rate);Delay_ms(100);// OV5640_ISPSize_Set(cam_mode.cam_isp_sx,
// cam_mode.cam_isp_sy,
// cam_mode.cam_isp_width,
// cam_mode.cam_isp_height);
// Delay(100);OV5640_OutSize_Set(cam_mode.scaling,cam_mode.cam_out_sx,cam_mode.cam_out_sy,cam_mode.cam_out_width,cam_mode.cam_out_height);Delay(100);OV5640_BrightnessConfig(cam_mode.brightness);Delay(100);OV5640_Color_Saturation(cam_mode.saturation);Delay(100);OV5640_ContrastConfig(cam_mode.contrast);Delay(100);OV5640_Exposure(cam_mode.exposure);Delay(100);OV5640_LightMode(cam_mode.light_mode);Delay(100);OV5640_SpecialEffects(cam_mode.effect); Delay(100);// Delay(500);
}
五:DCMI以及DMA配置
void OV5640_Init(void)
{DCMI_InitTypeDef DCMI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising;DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;DCMI_Init(&DCMI_InitStructure); OV5640_Start_DMA((uint32_t)LCD_MemoryAdd,160 * 800 * 2 / 4);//每次传输160行NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn ;//DMA数据流中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);DMA_ITConfig(DMA2_Stream1,DMA_IT_TC,ENABLE); /* 配置帧中断,接收到帧同步信号就进入中断 */NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn ; //帧中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);DCMI_ITConfig (DCMI_IT_FRAME,ENABLE); }
六:配置DMA发送完成中断和DCMI帧中断
void DMA2_Stream1_IRQHandler(void)
{if(DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1) == SET){//DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);//放在这里不行,不知道为啥linenum++;if(3 == linenum){linenum = 0;}OV5640_Start_DMA(LCD_MemoryAdd + 160*(800 *2*linenum), 160*800 * 2 /4);DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);}
}void DCMI_IRQHandler(void)
{if(DCMI_GetITStatus(DCMI_IT_FRAME) == SET){DCMI_ClearITPendingBit(DCMI_IT_FRAME);linenum = 0;}//OV5640_Start_DMA(LCD_MemoryAdd, 800 * 2 /4);}
因为DMA每次发送的项数不能超过65535, 每一项的大小为数据源的宽度,即PSIZE = 字,因此每次控制传输不能超过65535字,而每一行的大小为800 x 2 / 4(字),那么160 x 800 x 2 / 4 = 64000(字) < 65535(字), 这样分三次传输完一帧(480行), 每次传输160行,有效减少了出入DMA中断的次数,每帧进入DMA中断三次,然后在DCMI帧中断里重新开始新的一帧传输,保证同步。
六:开始捕捉
DCMI_Cmd(ENABLE);
DCMI_CaptureCmd(ENABLE);
注:
这里我的LCD第一层设置像素格式为RGB565,第二层设置为ARGB1555(可以实现字幕在画面上方的效果),
LTDC时钟经测试25M合适
效果图:
ov5640摄像头使用心得相关推荐
- linux摄像头 自动对焦,基于H3在Linux下驱动OV5640摄像头的方法与流程
技术特征: 1.基于H3在Linux下驱动OV5640摄像头的方法,其特征在于,包括如下步骤: S1打开OV5640摄像头所对应的设备文件/dev/videoX: S2为OV5640摄像头驱动添加读写 ...
- FPGA利用SCCB协议配置OV5640摄像头
FPGA利用SCCB协议配置OV5640摄像头 为什么要配置摄像头 配置代码 测试代码 总结 为什么要配置摄像头 OV5640摄像头有许多工作模式,如可以工作在1080P,720P,480P分辨率的情 ...
- 【FPGA】SCCB协议+ov5640摄像头
以下都引用自原子哥: SCCB(Serial Camera Control Bus,串行摄像头控制总线)是由OV公司定义和发展的三线式串行总线. 该总线控制着OV系列摄像头大部分的功能,包括图像数据格 ...
- FPGA配置OV5640摄像头及RGB图像数据采集
本文设计思想采用明德扬至简设计法.在做摄像头数据采集处理之前,需要配置OV5640传感器内部寄存器使其按要求正常工作,详细内容请参见<OV5640自动对焦照相模组应用指南>.首先要关注OV ...
- 【正点原子FPGA连载】第四十一章OV5640摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- 【正点原子FPGA连载】 第三十章双目OV5640摄像头LCD显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- OV5640摄像头配置(1)上电复位配置
OV5640摄像头配置(1)上电复位配置 1.引脚信息 OV5640 的视频输出接口共有10位,D[9:0].当输出为10-bit RGB raw格式时,使用D[9:0].当输出格式为8-bit YC ...
- 基于zynq7100的OV5640摄像头照相机实验,提供工程源码和技术支持
目录 1.设计架构 2.工程简介 3.zynq配置 4.sd卡文件系统FATFS配置 5.sd卡文件系统FATFS读写测试 6.OV5640摄像头显示测试 7.OV5640摄像头循环拍照测试 8.OV ...
- STM32H750获取OV5640摄像头图像及上位机解码(一维码二维码)
STM32H750获取OV5640摄像头图像及上位机解码(一维码&二维码) 1. 目的 针对静止拍摄图像场景,实现STM32H750对500万像素OV5640摄像头进行图像捕获,并通过串口将数 ...
- 【正点原子FPGA连载】第四十九章OV5640摄像头HDMI灰度显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
最新文章
- Spring MVC集成Spring Data Reids和Spring Session实现Session共享
- openfire 插件开发
- 百度景鲲:AI交互正在吃掉旧产品边界,触达移动互联网盲区用户 | MEET2020
- python读数据-python读取各种文件数据方法解析
- 使用juery在iframe内部访问父页面元素
- 运营商在万物互联扮演什么角色?上海联通NB-IoT奠定基础
- columnproperty server sql_获取SQL Server表字段的各种属性
- 使用Automake和Autoconf生成Makefile
- SpringBoot中的@ConfigurationProperties
- Spring MVC验证器应用实例(超详细)
- 2016北京集训测试赛(十三) Problem B: 网络战争
- testmarkdown
- qt html表格自动增加行,QT中的tablewidget如何插入一行数据
- js二进制流转换成图片_JavaScript PNG 图片编码和解码
- Vue-Layout(可视化布局)
- 这10个实用网站/app,至少让你的效率翻一倍!
- Loki 收集Nginx日志以 grafana 可视化展示
- PDF文件中的图片如何删除?分享两种删除方法
- ICMP协议之ping实现
- 如何一次高效的插入200MB(50万条)的insert语句