STM32
直播中

whfxsea668

12年用户 506经验值
擅长:模拟技术 EDA/IC设计
私信 关注
[问答]

如何对OV2640摄像头模块进行DCMI配置

OV2640是什么?
OV2640摄像头模块的特点有哪些?
如何对OV2640摄像头模块进行DCMI配置?

回帖(1)

胡芝恒

2021-10-15 16:08:50
一、OV2640简介
使用的摄像头是ATK-OV2640 摄像头模块
特点:
标准的 SCCB 接口,兼容 IIC 接口
支持 RawRGB、 RGB(RGB565/RGB555)、 GRB422、 YUV(422/420)和 YCbCr(422)输出格式
支持 UXGA、 SXGA、 SVGA 以及按比例缩小到从 SXGA 到 40*30 的任何尺寸
支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平
校准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。
支持图像缩放、平移和窗口设置
支持图像压缩,即可输出 JPEG 图像数据
自带嵌入式微处理器
集成有源晶振,无需外部提供时钟
集成 LDO,仅需提供 3.3V 电源即可正常工作
参数如表

外接引脚


       时序介绍

行像素输出时序

当HREF为高电平时,数据有效,没来一个PCLK, 输出8/10位数据。数据在PCLK下降沿更新,则MCU在PCLK上升沿是读取数据。
Tp表示像素周期, 在 RGB/YUV 输出格式下,每个 tp=2 个 Tpclk,如果是 Raw RGB 格式,则一个 tp=1 个 Tpclk,
其中: Tpclk 即 PCLK 信号的周期。
帧输出时序

Tline即行输出时间, Tp则是像素周期。 VSYNC 是帧同步信号,每一个脉冲,表示一个新帧的开始,而整个帧周期内,有 1200 次行像素(Row)输出,每一行为 1600 个像素,这样得到的输出数据,刚好是 1600*1200 的分辨率,即 UXGA 的分辨率。
二、STM32F4---OV2640DCMI配置
DCMI配置
使用STM32DCMI(数字摄像头接口) ,来对OV2640进行配置,且使用DCMI--DMA直接将摄像头帧数据传送到LCD显示。
首先对DCMI对应IO进行初始化,DCMI_HSYNC、DCMI_PCLK 、DCMI_VSYNC 、DCMI_D0~D7, 且复用IO。
对DCMI配置需要注意的是 :数据位8位、HREF低电平有效、PCLK上升沿有效、VSYNC低电平有效。
DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; // 连续模式
DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; // 全帧捕获
DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; //8位数据格式
DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low; //HSYNC 低电平有效
DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising; //PCLK 上升沿有效
DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; //硬件同步HSYNC,VSYNC
DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_Low; //VSYNC 低电平有效
DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);//开启帧中断
DCMI_Cmd(ENABLE); //DCMI使能
配置DCMI_DMA: DMA外设为DCMI-》DR数据寄存器,目的地址为LCD(LCD当做存储器)存储器地址。具体配置:
/* 配置 DMA Stream */
DMA_InitStructure.DMA_Channel = DMA_Channel_1; //通道1 DCMI通道
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI-》DR; //外设地址为:DCMI-》DR (DCMI获得数据)
DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;//DMA 存储器0地址 (LCD模拟SRAM存储器)
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //外设到存储器模式
DMA_InitStructure.DMA_BufferSize = DMA_BufferSize; //数据传输量 ( 1 )
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc; //存储器非增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //外设数据长度:32位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize; //存储器数据长度 半字 16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 使用循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFO模式
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; //使用全FIFO
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //外设突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //存储器突发单次传输
DMA_Init(DMA2_Stream1, &DMA_InitStructure);//初始化DMA Stream
其他配置完成后,若使能DCMI帧中断,程序会在图像每一帧中断一次,进入DCMI中断服务程序,可用来计数计算帧率
注意:
DCMI--DMA会在DCMI-》DR装满32位数据时自动将数据传送至LCD;
我使用的是3.2寸 320X240 LCD, 开始配置都正确完成配置, 可是LCD却无法正确显示,而是在顶部依次显示三个同样非正常图像,后来发现对于使用不同的LCD, 需要对OV2640 PCLKCLK进行分频匹配,可以通过设置 OV2640 的寄存器(0XD3 和 0X11),设置 PCLK 和时钟的分频来降低 PCLK 速度,从而使得低速 MCU 也可以读取 OV2640 的数据。不过这样会降低帧率。
//OV2640速度控制
//根据LCD分辨率的不同,设置不同的参数
void ov2640_speed_ctrl(void)
{
u8 clkdiv,pclkdiv; //时钟分频系数和PCLK分频系数
if(lcddev.width==240) //2.8寸LCD
{
clkdiv=1;
pclkdiv=28;
}else if(lcddev.width==320) //3.5寸LCD
{
clkdiv=3;
pclkdiv=15;
}else //4.3/7寸LCD
{
clkdiv=15;
pclkdiv=4;
}
SCCB_WR_Reg(0XFF,0X00);
SCCB_WR_Reg(0XD3,pclkdiv); //设置PCLK分频
SCCB_WR_Reg(0XFF,0X01);
SCCB_WR_Reg(0X11,clkdiv); //设置CLK分频
}
以上根据学习资料记录,仅用于学习
举报

更多回帖

发帖
×
20
完善资料,
赚取积分