打印
[其他ST产品]

使用DCMI(DVP)驱动OV2640

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
41
工程师犹饿死|  楼主 | 2023-11-26 20:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
连续采集模式

DCMI_CR 寄存器中的 CM = 0。当DCMI_CR的CAPTURE位置 1 后,DCMI等待帧起始信号,然后对数据采样,采样过程一直持续至CAPTURE位被清零。CAPTURE 位清零后,采集过程将持续到当前帧结束。


使用特权

评论回复
42
工程师犹饿死|  楼主 | 2023-11-26 20:24 | 只看该作者
在连续采集模式下,通过DCMI_CR中的FCRC位可设置捕获率来控制采集的数据量,如下图所示:

使用特权

评论回复
43
工程师犹饿死|  楼主 | 2023-11-26 20:25 | 只看该作者
2.3.5 裁剪功能
DCMI_CR寄存器的CROP位置1后,即开启采集功能。可从采集的图像从选择一个矩形窗口来裁剪图像。(注意若窗口大小超出图片大小,则进捕获图片大小)。

注意:CAPCNT值只能是4的倍数(两个最低有效位强制为0),才能通过DMA正确传输数据。

7889965633921b808b.png (24.62 KB )

7889965633921b808b.png

使用特权

评论回复
44
工程师犹饿死|  楼主 | 2023-11-26 20:26 | 只看该作者


如果在捕获DCMI_CWSIZE寄存器中指定行数完成之前,VSYNC信号已有效,那么捕获将停止,并且在中断使能时生成IT_FRAME中断。

使用特权

评论回复
45
工程师犹饿死|  楼主 | 2023-11-26 20:26 | 只看该作者
2.4 数据格式说明
DMCI支持单色、RGB 和 YCbCr数据格式(最大输入大小为2048×2048像素),以及JPEG压缩格式(大小无限制)。

对于单色、RGB 和 YCbCr,帧缓冲区以光栅模式存储(即从顶部像素行到底部像素行,从像素行的左侧到右侧)。使用32位字。仅支持小端对齐格式。


使用特权

评论回复
46
工程师犹饿死|  楼主 | 2023-11-26 20:26 | 只看该作者
2.4.1 JPEG 格式
DCMI_CR的JPEG位置1时,用于JPEG2(Joint photographic experts group)图像数据传输。

JPEG图像不按行和帧存储,因此VSYNC信号用于启动捕获过程,而HSYNC则用作数据使能信号。行中包含的字节数可能不是4的倍数,因此处理此类情况时应十分谨慎,因为需要每次从捕获的数据形成一个完整的32位字时,才生成一个DMA请求。检测到帧结束并且尚未凑成32位字时,将使用“0”进行填充,并触发一个DMA请求。

注意:裁剪功能和内嵌码同步不适用JPEG格式。

使用特权

评论回复
47
工程师犹饿死|  楼主 | 2023-11-26 20:26 | 只看该作者
2.4.2 单色格式
每个像素 8 位,单色逐行视频格式的数据存储方式如下表所示:

使用特权

评论回复
48
工程师犹饿死|  楼主 | 2023-11-26 20:26 | 只看该作者
2.4.3 RGB格式
仅支持16BPP(每个像素16位):RGB565(每32位表示2个像素);不支持24BPP(托盘化格式)和灰度格式。

像素分量包括 R(红色)、G(绿色)和 B(蓝色),一帧数据中各个分量交替间隔存储(低/高16位字节中R、G、B从MSB->LSB依次存储)。以 RGB 逐行视频格式存储数据格式如下表所示:

注意:若OV2640红色R与蓝色B错位,可通过0xda地址的bit0配置数据LSB先行还是MSB先行,同时0xc2地址的寄存器bit4会影响该的配置。

使用特权

评论回复
49
工程师犹饿死|  楼主 | 2023-11-26 20:27 | 只看该作者

使用特权

评论回复
50
工程师犹饿死|  楼主 | 2023-11-26 20:27 | 只看该作者
经实际测试,如下配置在UXGA模式下RGB颜色可正常显示:
0xFF, 0x00,        // 切换到DSP地址
0xc2, 0x0c,   //^ bit4配置为1时 swap RGB中的R与B
0xda, 0x09,   // BIT[3:2] = 10 - RGB565  BIT[0] = 1 LSB先行

使用特权

评论回复
51
工程师犹饿死|  楼主 | 2023-11-26 20:27 | 只看该作者
2.4.4 YCbCr 格式
YCbCr 4:2:2。像素分量包括Y(亮度)、Cb(蓝色色度)和Cr(红色色度)。每个分量都采用8位进行编码。亮度和色度(交替)存储在一起,如下表所示。

使用特权

评论回复
52
工程师犹饿死|  楼主 | 2023-11-26 20:27 | 只看该作者
2.5 DCMI中断


全局中断 (IT_DCMI) 是所有单个中断的逻辑或运算所得结果。

使用特权

评论回复
53
工程师犹饿死|  楼主 | 2023-11-26 20:28 | 只看该作者
3 STM32的DCMI编程
3.1 控制相关结构体
typedef struct
{
  uint16_t DCMI_CaptureMode;      /*!< 捕获模式,可选连续模式或快照模式 */
  uint16_t DCMI_SynchroMode;      /*!< 同步模式,可选硬件同步模式或内嵌码模式 */
  uint16_t DCMI_PCKPolarity;      /*!<像素时钟PIXCLK的有效边沿 */
  uint16_t DCMI_VSPolarity;       /*!< VSYNC的有效电平 */
  uint16_t DCMI_HSPolarity;       /*!< HSYNC的有效电平 */
  uint16_t DCMI_CaptureRate;      /*!< 捕获频率,可选all或1/2或1/4 */
  uint16_t DCMI_ExtendedDataMode; /*!< 数据线宽度 可选8/10/12/14*/
} DCMI_InitTypeDef;

使用特权

评论回复
54
工程师犹饿死|  楼主 | 2023-11-26 20:28 | 只看该作者
3.2 软件设计(使用CH32验证)
由于项目使用ch32v307芯片,因此基于此芯片完成本次实验,STM32配置流程类似。

使用DVP外设(即STM32的DCMI外设)采集摄像头数据,将DVP的FIFO数据缓存到内部RAM中,再使用DMA的M2M模式搬运到FSMC外设控制的内存中,最后让图像在屏幕上显示。

使用特权

评论回复
55
工程师犹饿死|  楼主 | 2023-11-26 20:28 | 只看该作者
3.2.1 外设初始化

使用特权

评论回复
56
工程师犹饿死|  楼主 | 2023-11-26 20:28 | 只看该作者
int8_t OV2640_Init(uint16_t img_w, uint16_t img_h)
{
    uint16_t ov_pid, ov_mid;
    OV2640_IDTypeDef OV2640_Camera_ID;

    img_width = img_w;
    img_height = img_h;

    OV2640_GPIO_Init();
    OV2640_Reset();

    OV2640_ReadID(&OV2640_Camera_ID);
    ov_mid = OV2640_Camera_ID.MIDH << 8 | OV2640_Camera_ID.MIDL;
    ov_pid = OV2640_Camera_ID.PIDH << 8 | OV2640_Camera_ID.PIDL;

    DBG_RAW("MID: %x", ov_mid);
    DBG_RAW("PID: %x", ov_pid);

    if (ov_mid != OV2640_MID)                return -1;
    else if (ov_pid != OV2640_PID)        return -2;

    OV2640_DMA_Init((uint32_t)dvp_buf0, FSMC_LCD_DATA_ADDR, lcd.width);
    OV2640_DVP_Init((uint32_t*)dvp_buf0, (uint32_t*)dvp_buf1, RGB565_COL_NUM, RGB565_ROW_NUM);

    return 0;
}

使用特权

评论回复
57
工程师犹饿死|  楼主 | 2023-11-26 20:28 | 只看该作者
理论配置:OV2640捕获沿PCLK上升沿采样,HSYNC低电平有效,VSYNC高电平有效;

实际配置:OV2640捕获沿PCLK上升沿采样,HSYNC高电平有效,VSYNC高电平有效。(可见理论与实际存在差异zz)
注:有效电平指的是采集完一行/帧图像后的状态电平

使用特权

评论回复
58
工程师犹饿死|  楼主 | 2023-11-26 20:29 | 只看该作者
ch32v307的DMA与DVP外设关键信息如下:

「DMA外设(与STM32基本无异)」

DMA传输一次性最大数据量为65535,同时M2M不支持循环模式,且一但使能即开始后传输数据,因此数据传输完后需要手动加载DMA_CNTRx剩余传输数据数目寄存器的初始值,同时若DMA_PADDRx外设基址寄存器和DMA_MADDRx内存基址寄存器配置了地址增量模式,需要重新设置基址。

DMA通道关闭后,DMA_PADDRx/DMA_MADDRx/DMA_CNTRx/DMA_CFGRx寄存器仅当相应的DMA通道关闭下才可写入。

使用特权

评论回复
59
工程师犹饿死|  楼主 | 2023-11-26 20:29 | 只看该作者
「DAP外设(即STM32的DCMI外设)」

对于RGB和YUV数据流,硬件在每次帧信号从无效电平变为有效电平时会复位选择BUF0开始,存满一行数据将会切换的BUF1,实现交替存储。R16_DVP_COL_NUM表示一行数据的有效PCLK周期数,R16_DVP_ROW_NUM表示一帧图像数据内包含的行数;
对于JPEG压缩数据,硬件会根据设置的DMA接收长度设置BUF0和BUF1的切换阈值。此模式下,R16_DVP_COL_NUM用于配置DMA长度,R16_DVP_ROW_NUM寄存器不起作用。

使用特权

评论回复
60
工程师犹饿死|  楼主 | 2023-11-26 20:29 | 只看该作者
CH32的DAP外设与STM32的DCMI外设差异较大,其使用双BUF的FIFO缓存数据。在RGB模式下每个BUF交替采集每行数据;同时CH32的DMA不支持直接将DVP外设的FIFO数据通过DMA传输到内存(P2M),因此只能使用RAM先缓存FIFO数据,再通过DMA的M2M模式传输。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则