STM32
登录
直播中
whfxsea668
12年用户
506经验值
擅长:模拟技术 EDA/IC设计
私信
关注
[问答]
如何对OV2640摄像头模块进行DCMI配置
开启该帖子的消息推送
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分频
}
以上根据学习资料记录,仅用于学习
一、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分频
}
以上根据学习资料记录,仅用于学习
举报
更多回帖
rotate(-90deg);
回复
相关问答
OV2640
摄像头
DCMI
求助,关于
OV2640
摄像头
的问题
2018-11-12
3679
PaddlePi-K210开发板除了支持
ov2640
ov
5640
摄像头
外,还支持哪些
摄像头
作为外设?
2023-09-14
291
请问大佬能在imx6-q板子linux系统下调用
ov2640
摄像头
么?
2022-01-10
1859
更换
摄像头
电压不匹配的问题如何解决?
2023-03-13
554
用STM32F103ZET6的控制器可以同时驱动多个
摄像头
模块
吗
2020-07-11
2552
如何去制作一个基于AT32和
OV2640
的USB
摄像头
呢
2021-11-05
1386
可以jpg输出的
摄像头
sensor型号
2021-03-02
2611
OV2640
模块
和SDIO接口wifi出现冲突
2019-06-17
2458
ov2640
摄像头
id读取错误有大佬知道是什么原因吗
2022-10-10
1712
请问
OV2640
摄像头
循迹的二值化该怎么弄
2019-01-25
3560
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分