基于STM32F429的DCMI实现OV7725-NF无缓存摄像头的图像采集HAL库

基于STM32F429的OV7725-NF无缓存摄像头的DCMI图像采集 和LTDC显示

  • 0. 首先说明一下时钟配置
  • 1. DCMI配置
    • 1.1 首先点击DCMI进入配置页面后,要选择Mode
    • 1.2 然后要进行GPIO settings
    • 1.3 然后是Parameter settings参数设置
    • 1.4 DMA settings
    • 1.5 需要使用的HAL库函数
  • 3. OV7725配置寄存器
  • 4. LTDC显示器显示
    • 接口配置
    • 完成以上配置后,LTDC就可以工作了。当我们需要把OV7725采集的图像进行显示时,只要在DCMI的帧中断或垂直同步中断中,把帧图像缓存地址向LTDC的图层句柄的起始地址赋值,然后调用一次配置函数即可,这样每接收完一帧图像,即触发一次显示刷新。

STM32F429具备DCMI摄像头接口,可利用DMA功能实现快速的硬件级图像采集存储,大大降低了纯软件开发的难度。开发教程 络上一大堆,但本人一开始也是经历了九九八十一难,一直不出图像,过程中还是有不少坑需要自己填一下,以此记录。完整的案例代码见以下链接。
CAM2LCDonF429IGT6.rar

0. 首先说明一下时钟配置

1.2 然后要进行GPIO settings

根据实际使用的电路连接选择对应的引脚,调整的时候要在“Pinout view”界面中进行修改。

1.3 然后是Parameter settings参数设置

一共就以下5个需要配置的:

1.4 DMA settings

DMA mode有normal和circular两个选项,normal指执行一次DMA传输后停止,circular指连续循环执行数据搬移。
Data Width的选择应与实际一致,我们要将OV7725通过DCMI传入的外设数据搬移到内部存储器中,OV7725在传给DCMI时一次传8bits,但DCMI内部会将接收到的摄像头数据放到一个 32 位数据寄存器(DCMI_DR)中,然后通过通用DMA 进行传输。也就是说DCMI接收处理4次放满32bits数据后才会发起一次DMA传输。如果想使用DMA的FIFO,可以选择Use Fifo,并选定Threshold参数。

此处我们的图像编码格式是RGB565,按照上述说明,DCMI输出的32位数据应该是下图这种排列方式,当LTDC读取时也是这样的格式,通过实现发现是可以直接解码的,不需要进行位变换,但这部分内部原理还需要摸清楚,这里暂时不展开。

1.5 需要使用的HAL库函数

  • 启动DCMI:HAL_StatusTypeDef HAL_DCMI_Start_DMA (DCMI_HandleTypeDef * hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length)

  • 结束DCMI:HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef * hdcmi)

  • 行接收完毕中断:void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef * hdcmi)

  • 帧接收完毕中断:void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef * hdcmi) 或
    void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)

3. OV7725配置寄存器

OV7725按照定义的引脚连接好后就可以工作了,具体各个引脚功能如下表所示:

作用描述 作用描述
VCC3.3 模块供电脚,接 3.3V 电源[输入] OV_PCLK 像素时钟输出[输出]
GND 模块地线[输入] OV_VSYNC 帧同步信 [输出]
OV_SCL SCCB 通信时钟信 [输入] OV_HREF 行同步信 [输出]
OV_SDA SCCB 通信数据信 [双向] OV_RESET 复位信 ,低电平复位[输入]
SGM_CTRL 传感器时钟选择控制,高电平时使用模块内部晶振,低电平时使用XCLK_IN外部时钟信 [输入] OV_D[7:0] 数据输出(8 位)[输出]
XCLK_IN 外部时钟输入[输入] 我是用的摄像头内置晶振频率为12MHz

但是他的参数设置可是多的一批,一共有0x00-0xac个8位寄存器,要想获得优秀画质,就得摸透这些寄存器。下面是官方给出的有用的寄存器配置方案,具体应用时可适当调整:
【注意】:硬件I2C有一些bug,不太好用,总是busy状态,推荐使用软件I2C进行配置通信。

4. LTDC显示器显示

LTDC是一种TFT显示屏接口,全称为LCD-TFT display controller,属于显示像素接口的一种,显示控制器提供了一个并行的数字RGB(红、绿、蓝)信 、以及水平/垂直同步信 、像素时钟作为输出,直接与各种LCD和TFT面板连接,且显示面板不需要缓存。一帧开始后,从左向右、从上向下一个像素一个像素输出RGB值,类似VGA逐行扫描刷新。
STM32的LTDC使用非常简单,完成参数配置后,只要定时向图层句柄设置图像数据地址即可,代码量非常少,基本可以看成STM32的显卡。

接口配置

  1. layer settings主要是对图层参数进行设置。
    STM32F429共提供两个图层,每个图层的配置基本相似,下面是单个图层的配置说明。
    基于STM32F429的DCMI实现OV7725-NF无缓存摄像头的图像采集HAL库

完成以上配置后,LTDC就可以工作了。当我们需要把OV7725采集的图像进行显示时,只要在DCMI的帧中断或垂直同步中断中,把帧图像缓存地址向LTDC的图层句柄的起始地址赋值,然后调用一次配置函数即可,这样每接收完一帧图像,即触发一次显示刷新。

void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi){	pLayerCfg.FBStartAdress =  IMG_ADDR;	if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)	{		Error_Handler();	}}

                                                        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月19日
下一篇 2022年5月19日

相关推荐