DCMI接口

目录

DCMI数字摄像头接口

DCMI引脚

摄像头引脚

操作过程与通信方式

硬件连接图

写操作

读操作

图像输出

数据格式

rawRGB

 YUV

RGB

JPEG

代码实现过程简述

学习过程的问题

YUV是亮度和色度的格式,为什么UV中取Cb蓝和Cr红作为色度?

提问MIPI、DVP、DCMI是什么关系?


DCMI数字摄像头接口

同步并行接口,可接受外部8-14位CMOS摄像头模块的高速数据流。支持YUV,RGB原始的按行帧格式组织的图像数据(具体见下文数据格式),也支持JPEG格式压缩的数据流。

DCMI引脚

DCMI从外部接收数据,PIXCLX最高为HCLK的1/4

摄像头引脚

操作过程与通信方式

硬件连接图

写操作

数字摄像头OV2640通过类I2C实现,SCCB读写过程定义了两种写操作,分为三步或两步写操作。

三步,1发送7b从设备ID地址+读写方向,2发送从设备目标寄存器8b地址,3发送要写入寄存器的8b数据。

两步,不发送上述第3步8b数据。

读操作

两步读操作,从设备目的寄存器中读取数据。发送从设备ID+R标志(设备地址+读标志)和自由位,在二阶段中读取寄存器中的8b数据和写NA位(非应答信号)。读操作没有确定的目的寄存器地址,所以在读操作前,需有一个两步写操作提供操作的寄存器地址。

图像输出

时序有VGA\SVGA\UXGA等时序,图像输出在帧内从左到右从上到下一个像素输出,顺序可变。这里的VGA一般指640×480的屏幕分辨率,QVGA指320×240.

输出图像格式可以设置RGB565,意思数据位分别以R\G\B为基的2次多项式的16次方,即16b数据为一像素,RGB888等同理

数据格式

摄像头sensor的数据输出格式。_天际草原的博客-CSDN博客_摄像头数据格式

Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别_southcamel的博客-CSDN博客_raw rgb yuv

rawRGB

传感器基带数据,即初始模拟信号,每一像素对应一个彩色滤光片,滤光片按Bayer pattern分布,将每一个像素的数据直接输出。

 YUV

(YCbCr为换算后的数字信号),CCIR601 CCIR656

YUV详解数据和格式_Alex_designer的博客-CSDN博客_yuv数据

Y表示亮度,单位Luma,指灰度值;UV表示色度(Cb蓝色度 Cr红色度),描述影像色彩及饱和度,用于指定像素的颜色。存储格式分为planar和packed,前者分块存储Y\U\V像素数据,后者交叉存储YUV数据,使用一个数组存储一个像素的YU 或 YV,依次交叉,这部分可细分三种方式YUV444/422/420。若如此存储则压缩了图像,损失了信息。

RGB

RGB565 RGB555 RGB24 RGB32 ARGB(带Alpha通道)

RGB565通过raw数据进行插值获取,丢失信息,R5G3 G3B5方式存储,G多一位是因为人眼对绿色敏感。500M以上的sensor只输出RAW数据以保证比较快的输出速度。

JPEG

先经过系列转换成必要格式,如YCbCr,再进行离散余弦量化编码压缩。

代码实现过程简述

注:具体设置根据不同芯片sdk为准,以STM32F4xx系列为例

初始化I2C接口IO,时钟及使能。进行I2C功能配置,选择CLK频率、寻址长度、自身地址,时钟线占空比和角色模式等。

初始化DCMI接口IO,时钟及使能,同时使能PWDN为低,供电。

配置DCMI功能,捕获模式、信号同步方式、同步信号及像素时钟的触发方式、捕获数、数据长度等。

配置DMA/DMA2D(图形专用加速)功能。使用DMA,DMA通道、外设地址、显存地址,DMA方向自增模式、优先级、FIFO;使用DMA2D配置LCD图像显示于LCD显示相关文章中再介绍。

通过I2C写入寄存器配置数据,选择不同分辨率及图像设置等,具体可见各摄像头datasheet。

学习过程的问题

YUV是亮度和色度的格式,为什么UV中取Cb蓝和Cr红作为色度?

YUV可以转换成RGB格式,公式如下。

详解各种RGB与YUV(YCbCr)互转公式 - 简书 (jianshu.com)

这东西引出一个大坑。

提问MIPIDVPDCMI是什么关系?

MIPI是MIPI联盟定义的一个移动端处理器规范,MIPI的camera接口叫CSI,显示接口叫DSI。DVP接口直接对应DCMI接口。前者适用于高速率高分辨率,后者低于500w像素。

### DCMI 接口定义 DCMI(Digital Camera Interface)是 STM32 微控制器中的一个外设模块,专门用于连接数字摄像头设备并接收图像数据。它支持多种工作模式和分辨率配置,能够通过 DMA 或中断方式高效处理来自摄像头的数据流。 --- ### DCMI 接口使用方法 #### 初始化过程 为了使能 DCMI 功能并与外部摄像头通信,需完成以下操作: 1. **初始化 GPIO 配置** 将与 DCMI 相关的 GPIO 引脚配置为复用功能模式。例如,在 OV7670 和 STM32 的硬件连接中,GPIO 映射关系已由开发板设计决定[^2]。这些引脚通常包括同步信号线(VSYNC、HREF)、像素时钟(PIXCLK)以及数据总线(D[7:0])。 2. **调用 `DCMI_Init` 函数** 设置 DCMI 参数结构体以指定图像尺寸、颜色格式以及其他属性。此函数负责启动硬件资源分配及寄存器写入动作[^1]。 ```c DCMI_InitTypeDef dcmi_init; dcmi_init.DCMI_PCKPolarity = DCMI_PCKPOLARITY_FALLING; // 像素时钟极性 dcmi_init.DCMI_HSPolarity = DCMI_HSPOLARITY_LOW; // 行同步信号极性 dcmi_init.DCMI_VSPolarity = DCMI_VSPOLARITY_HIGH; // 场同步信号极性 dcmi_init.DCMI_DataSize = DCMI_DATASIZE_8BIT; // 数据位宽 HAL_DCMI_Init(&hdcmi, &dcmi_init); ``` 3. **启用捕获命令** 利用 `HAL_DCMI_Start_DMA()` 方法开启连续采集流程,并绑定目标存储区域地址至 DMA 控制单元。该步骤允许自动将接收到的画面片段转移到内存缓冲区内。 4. **管理回调事件** 如果采用异步机制,则需要实现特定的服务例程来响应结束标志或者错误状态通知。这有助于实时监控进度状况并采取适当措施恢复异常情形。 --- ### 示例代码展示 以下是基于 HAL 库构建的一个简单应用框架实例: ```c #include "stm32f4xx_hal.h" // 定义全局变量作为临时存放空间 static uint8_t image_buffer[WIDTH * HEIGHT]; int main(void) { HAL_Init(); // 系统初始化 SystemClock_Config(); // 时钟树调整 MX_GPIO_Init(); // 外围电路准备 MX_DCMI_Init(); // 数码相机接口激活 MX_DMA_Init(); // 存储转发引擎联机 while (1) { if(HAL_DCMI_StateGet(&hdcmi) != HAL_DCMI_STATE_BUSY_CAPTURE){ /* 启动新一轮抓拍 */ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)&image_buffer, WIDTH*HEIGHT); /* 更新图形界面内容 */ lv_canvas_set_px(canvas_obj, image_buffer, WIDTH, HEIGHT); } delay_ms(50); // 添加短暂停顿防止过度占用 CPU 时间片 } } void HAL_DCMI_FrameEventCallback(DCM_HandleTypeDef *hdcmi) { // 当一帧完全获取完毕后触发的动作逻辑 } ``` 上述程序展示了如何利用循环读取的方式不断刷新显示效果,同时结合第三方 GUI 工具包 LVGL 来呈现最终成果[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值