1.DCMI的简介
DCMI全称Digital camera interface(数字摄像头接口),是一种可以采集摄像头数据的一种接口。此接口适用于黑白摄像头、X24 和 X5 摄像头,并可以假定所有预处理(如调整大小)都可以在该摄像头模块中执行。支持原始的按行、帧格式来组织的图像数据,如 YUV、 RGB,也支持接收 JPEG 格式压缩的数据流。接收数据时,主要使用 HSYNC 及 VSYNC 信号来同步。
STM32 的 DCMI 接口整体框图
DCMI 的信号线说明
2.OV5640 传感器简介
图像传感器是摄像头的核心部件,上述摄像头中的图像传感器是一款型号为 OV5640 的 CMOS
类型数字图像传感器。该传感器支持输出最大为 500 万像素的图像 (2592x1944 分辨率),支持使
用 VGA 时序输出图像数据,输出图像的数据格式支持 YUV(422/420)、 YCbCr422、 RGB565 以及
JPEG 格式,若直接输出 JPEG 格式的图像时可大大减少数据量,方便网络传输。它还可以对采
集得的图像进行补偿,支持伽玛曲线、白平衡、饱和度、色度等基础处理。根据不同的分辨率配
置,传感器输出图像数据的帧率从 15-60 帧可调,工作时功率在 150mW-200mW 之间。
OV5640 管脚说明
SIO_C 和 SIO_D 引脚:SIO_C 与 SIO_D 使用的通讯协议跟 I2C 十分类似,在 STM32 中我们完全可以直接用 I2C 硬件外设来控制。此两个管脚用于写入和读取OV5640中的控制寄存器。
RESETB :引脚为低电平时,用于复位整个传感器芯片。
PWDN: 用于控制芯片进入低功耗模式
XCLK: XCLK引脚,它跟 PCLK 是完全不同的, XCLK 是用于驱动整个传感器芯片的时钟信号,是外部输入到 OV5640 的信号;而 PCLK 是 OV5640 输出数据时的同步信号,它是由 OV5640 输出的信号。 XCLK 可以外接晶振或由外部控制器提供,若要类比XCLK 之于 OV5640 就相当于 HSE 时钟输入引脚与 STM32 芯片的关系, PCLK 引脚可类比STM32 的 I2C 外设的 SCL 引脚。
OV5640像素数据输出时序
OV5640 采用 SCCB 协议进行控制,而它输出图像时则使用 VGA 时序 (还可用 SVGA、 UXGA,
这些时序都差不多),这跟控制液晶屏输入图像时很类似。 OV5640 输出图像时,一帧帧地输出,
在帧内的数据一般从左到右,从上到下,一个像素一个像素地输出 (也可通过寄存器修改方向),若我们使用 Y2-Y9 数据线,图像格式设置为 RGB565,进行数据输出时, Y2-Y9数据线会在 1 个像素同步时钟 PCLK 的驱动下发送 1 字节的数据信号,所以 2 个 PCLK 时钟可发送 1 个 RGB565 格式的像素数据。像素数据依次传输,每传输完一行数据时,行同步信号 HREF会输出一个电平跳变信号,每传输完一帧图像时, VSYNC 会输出一个电平跳变信号。
DCMI时序图
3.DCMI编程要点
(1).配置SIO_C,SIO_D的接口,即配置IIC,用于通过IIC接口写入和读取OV5640相关的寄存器。
(2).配置VSYNC(帧同步信号),HSYNC(行同步信号),PIXCLK(像素时钟),D0-D7(像素数据)为复用的IO管脚,配置PWDN,RST管脚为普通的IO输出管脚。
(3).配置DCMI
配置采集模式(连续采集或者单次采集)
配置像素时钟是上升沿有效还是下降沿有效
配置帧同步信号是高电平有效还是低电平有效
配置行同步信号是高电平有效还是低电平有效
配置像素数据的是全采集还是二分之一采集还是四分之一采集
配置像素数据的数据宽度,即用到几根像素数据,一般是8根数据线。
(4).配置DCMI的中断,用于在一帧数据传输完成之后,重新配置DMA。
(5).配置DMA以及DMA的中断,用于从DCMI的数据寄存器中读取像素数据。DCMI 数据寄存器 (DCMI_DR),数字摄像头接口每收到 32 位数据,才触发一次 DMA 请求。 4 字深度的 FIFO 可为 DMA 传输留出足够时间并避免出现 DMA 溢出情况。
(6).启动DCMI以及DMA