stm32-DCMI摄像头

总结stm32系列中DCMI摄像头的使用方法。

前言

stm32系列中,f4带有DCMI外设。

所使用的摄像头是ov5640。关于这个摄像头的有关信息可以去这里找到:

SCCB时序

由于ov5640使用的是SCCB时序. 并且SCCB时序还IIC时序非常相似. 二者的异同如下:

不同点:

  • SCCB一次只可以读或写一个字节的数据,而IIC是可以多个字节的。

相同点
SCCB的起始信号、停止信号及数据有效性与I2C完全一样。

  • 起始信号:在SIO_C为高电平时,SIO_D出现一个下降沿,则SCCB开始传输。

  • 停止信号:在SIO_C为高电平时,SIO_D出现一个上升沿,则SCCB停止传输。

  • 数据有效性:除了开始和停止状态,在数据传输过程中,当SIO_C为高电平时,必须保证SIO_D上的数据稳定, 也就是说,SIO_D上的电平变换只能发生在SIO_C为低电平的时候,SIO_D的信号在SIO_C为高电平时被采集。

时序图如下:

SCCB的读时序

读时序的步骤一共是两步:

  1. 发送从设备的设备ID+R标志(设备地址+读方向标志)和自由位
  2. 读取寄存器中的8位数据和写NA位(非应答信号)

SCCB的写时许

写时序主要分为三步写时许和两步写时序

三步写时序:

  1. 首先发送从设备的ID地址+w标志
  2. 在发送从设备的八位地址
  3. 最后发送一字节的内容

两步写时许:这个时序主要是用来和读时序一起使用的,由于读操作没有提供目标寄存器的地址,所以需要一个两步写操作来提供。

  1. 发送从设备的ID地址
  2. 发送从设备的八位地址

DCMI外设

DCMI,数字摄像头接口(Digital cameraInterface)。在stm32f4xx系列单片机中提供了这个外设。

其作用为:
它支持使用上述类似VGA的时序获取图像数据流,支持原始的按行、帧格式来组织的图像数据,如YUV、RGB, 也支持接收JPEG格式压缩的数据流。接收数据时,主要使用HSYNC及VSYNC信号来同步。

其实就是接收图像数据

编程

1
2
3
4
5
6
7
8
9
10
typedef struct
{
uint16_t DCMI_CaptureMode; /*选择连续模式或拍照模式 */
uint16_t DCMI_SynchroMode; /*选择硬件同步模式还是内嵌码模式 */
uint16_t DCMI_PCKPolarity; /*设置像素时钟的有效电平*/
uint16_t DCMI_VSPolarity; /*设置VSYNC的有效电平*/
uint16_t DCMI_HSPolarity; /*设置HSYNC的有效电平*/
uint16_t DCMI_CaptureRate; /*设置图像的采集间隔 */
uint16_t DCMI_ExtendedDataMode; /*设置数据线的宽度 */
} DCMI_InitTypeDef;

极性:极性就是初始电平是高还是低

相位: 相位就是从第一个跳变沿可以检测还是从第二个跳变沿开始检测

参数解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(1) DCMI_CaptureMode

本成员设置DCMI的捕获模式, 可以选择为连续摄像(DCMI_CaptureMode_Continuous)或单张拍照DCMI_CaptureMode_SnapShot。

(2) DCMI_SynchroMode

本成员设置DCMI数据的同步模式, 可以选择为硬件同步方式(DCMI_SynchroMode_Hardware)或内嵌码方式(DCMI_SynchroMode_Embedded)。

(3) DCMI_PCKPolarity

本成员用于配置DCMI接口像素时钟的有效边沿,即在该时钟边沿时,DCMI会对数据线上的信号进行采样, 它可以被设置为上升沿有效(DCMI_PCKPolarity_Rising)或下降沿有效(DCMI_PCKPolarity_Falling)。

(4) DCMI_VSPolarity

本成员用于设置VSYNC的有效电平,当VSYNC信号线表示为有效电平时,表示新的一帧数据传输完成, 它可以被设置为高电平有效(DCMI_VSPolarity_High)或低电平有效(DCMI_VSPolarity_Low)。

(5) DCMI_HSPolarity

类似地,本成员用于设置HSYNC的有效电平,当HSYNC信号线表示为有效电平时,表示新的一行数据传输完成, 它可以被设置为高电平有效(DCMI_HSPolarity_High)或低电平有效(DCMI_HSPolarity_Low)。

(6) DCMI_CaptureRate

本成员可以用于设置DCMI捕获数据的频率,可以设置为全采集、半采集或1/4采集(DCMI_CaptureRate_All_Frame/ 1of2_Frame/ 1of4_Frame), 在间隔采集的情况下,STM32的DCMI外设会直接按间隔丢弃数据。

(7) DCMI_ExtendedDataMode

本成员用于设置DCMI的数据线宽度,可配置为8/10/12及14位数据线宽(DCMI_ExtendedDataMode_8b/10b/12b/14b)。

捕获模式

其中的捕获模式含义为:分别为快照模式和连续采集模式。快照模式时只采集一帧的图像数据,连续采集模式会一直采集多个帧的数据, 并且可以通过配置捕获率来控制采集多少数据,如可配置为采集所有数据或隔1帧采集一次数据或隔3帧采集一次数据。

同步模式

参数解释中的同步模式

  • 硬件同步
  • 内嵌码同步

硬件同步就是使用HSYNCVSYNC两种模式进行同步。

内嵌码同步:
而内嵌码同步的方式是使用数据信号线传输中的特定编码来表示同步信息,由于需要用0x00和0xFF来表示编码, 所以表示图像的数据中不能包含有这两个值。利用这两个值,它扩展到4个字节,定义出了2种模式的同步码,每种模式包含4个编码, 编码格式为0xFF0000XY,其中XY的值可通过寄存器设置。当DCMI接收到这样的编码时,它不会把这些当成图像数据, 而是按照表 两种模式的内嵌码 中的编码来解释,作为同步信号。

参考资料

https://doc.embedfire.com/mcu/stm32/f407batianhu/std/zh/latest/book/DCMI_OV5640.html


stm32-DCMI摄像头
https://ysc2.github.io/ysc2.github.io/2024/03/08/stm32-DCMI摄像头/
作者
Ysc
发布于
2024年3月8日
许可协议