基于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. DCMI配置

1.1 首先点击DCMI进入配置页面后,要选择Mode

不同的mode代表不同的数据格式。下图中,8bits Embedded Synchro是指码流中嵌入同步码元的编码形式,其他的External Synchro都是通过单独的硬线提供同步信号。8、10、12、14是指数据位宽,像OV7725是8位宽数据+硬线同步,所以应该选择“Slave 8 bits External Synchro”。

1.2 然后要进行GPIO settings

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

1.3 然后是Parameter settings参数设置

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

前3个参数是和所接摄像头参数对应的,要保持一致,分别是指PCLK触发沿选择、垂直同步信号VSYNC极性、水平同步信号HREF极性,注意OV7725提供的水平同步信号是HREF而不是HSYNC。
从下图OV7725时序图可以看出,PCLK上升沿有效,所以选Active on Rising edge.

但是,从下图帧时序图中看到,当VSYNC低电平,且HREF、HSYNC高电平时,才传输有效数据,DCMI配置选项中的Active High是指高电平时进行同步,官方称为消隐信号,也就是低电平时进行传数。这个一定要选对,不然接收到的数据永远都是0x00。对应OV7725的正确选择应该是:V=Active high; H=Active low。

接下来是“Frequency of frame capture”,这个是指DCMI接收处理的帧频率,通俗点就是说摄像头在一直发送图像数据,可能帧频率是60fps,但我们实际不需要这么高的帧率,可以通过这个选项选择“每处理1帧,丢弃3帧”、“每处理1帧,丢弃1帧”、“全部处理”。根据实际需要选择。

最后一个JPEG mode是指接收的数据流传输的是否为JPEG压缩数据。OV7725输出的VGA、QVGA、CIF格式都是非压缩数据,所以这里要选Disabled。

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进行配置通信。

    //输出窗口设置{COM7,      0x46}, //QVGA RGB565{HSTART,    0x3f}, //水平起始位置{HSIZE,     0x50}, //水平尺寸{VSTRT,     0x03}, //垂直起始位置{VSIZE,     0x78}, //垂直尺寸{HREF,      0x00},{HOutSize,  0x50}, //输出尺寸高,QVGA320填0x50; VGA填0xA0;{VOutSize,  0x78}, //输出尺寸宽,QVGA480填0x78; VGA填0xF0;//帧率//30 fps, PCLK = 12Mhz{CLKRC,     0x01}, //CLKRC, F/2/2;F(internal clock) = F(input clock)/(Bit[5:0]+1)/2{COM4,      0x41}, //COM4, PLL 4倍频{EXHCH,  0x00},{EXHCL,     0x00},{DM_LNL,    0x00},  //DM_LNL, Dummy Row Low 8 Bits{DM_LNH,     0x00}, //DM_LNH, Dummy Row High 8 Bits{ADVFL,  0x00},{ADVFH,     0x00},{COM5,      0xf5},//夜晚模式下自动帧率控制开启//DSP control{TGT_B,     0x80},//{TGT_B,     0x7f},{FixGain,   0x00},//0x09{AWB_Ctrl0, 0xf0},//0xe0{DSP_Ctrl1, 0x1f},//0xff{DSP_Ctrl2, 0x00},{DSP_Ctrl3, 0x10},{DSP_Ctrl4, 0x00},//AGC AEC AWB{COM8,      0x8f},//0xf0{COM4,     0x41}, //Pll AEC CONFIG{COM6,      0x43},//0xc5{COM9,     0x4a},//0x11{BDBase,   0xfF},//0x7f{BDMStep,  0x01},//0x03{AEW,      0x40},{AEB,       0x30},{VPT,       0xa1},{EXHCL,     0x9e},{AWBCtrl3,  0xaa},{COM8,      0xff},//matrix shapness brightness contrast{EDGE1,     0x08},{DNSOff,    0x01},{EDGE2,     0x03},{EDGE3,     0x00},{MTX1,      0xb0},{MTX2,      0x9d},{MTX3,      0x13},{MTX4,      0x16},{MTX5,      0x7b},{MTX6,      0x91},{MTX_Ctrl,  0x1e},{BRIGHT,    0x08},{CNST,      0x20},{UVADJ0,    0x81},{SDE,       0X06},{USAT,      0x65},{VSAT,      0x65},{HUECOS,    0X80},{HUESIN,    0X80},//GAMMA config{GAM1,     0x0c},{GAM2,      0x16},{GAM3,      0x2a},{GAM4,      0x4e},{GAM5,      0x61},{GAM6,      0x6f},{GAM7,      0x7b},{GAM8,      0x86},{GAM9,      0x8e},{GAM10,     0x97},{GAM11,     0xa4},{GAM12,     0xaf},{GAM13,     0xc5},{GAM14,     0xd7},{GAM15,     0xe8},{SLOP,      0x20},{COM3,      0x40},//Horizontal mirror image;默认0x10,即改变YUV为UVY格式。但是摄像头不是芯片而是模组时,要将0X10中的1变成0,即设置YUV格式{COM10,       0x00}, //默认VSYNC 低电平有效。如果要兼容OV2640 DCMI的配置这里需要VSYNC 高电平有效{COM2,        0x01}, //设置输出驱动能力为2倍

4. LTDC显示器显示

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

接口配置

  1. LTDC主要的接口IO有像素时钟LCD_CLK、水平同步HSYNC、垂直同步VSYNC、数据有效DE和3组RGB数据信号并行线,STM32F429最大支持RGB888显示输出,Display Type选项要根据所使用的显示屏支持的数据格式进行选择。
  2. configuration中的parameter settings是最核心的配置,其中下图红框中的参数是由所使用的显示屏决定的,通常显示屏datasheet中都会给出,比如我使用的TM043NDH02给出的配置参数见第二张图,只要一一对应匹配即可。


3. signal polarity有效电平配置
这部分有效电平的设置一定要和使用的显示屏相符合,下图为我是用的显示屏datasheet对IO电平的要求。

  1. layer settings主要是对图层参数进行设置。
    STM32F429共提供两个图层,每个图层的配置基本相似,下面是单个图层的配置说明。

完成以上配置后,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();}
}

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

  1. 物联网控制卡学习资料第465篇:基于STM32F429多路RS232 物联网控制卡

    基于STM32F429多路RS232 物联网控制卡 一.板卡概述            板卡基于STM32F429核心板进行扩展,包括多路RS232,百兆网络,RS232 可以扩展多路 声避障模块.G ...

  2. matlab rbf函数_基于径向基函数(RBF)的无网格伪谱法与程序实现(2)——微分矩阵...

    参考资料 Gregory E. Fasshauer. Meshfree Approximation Methods with MATLAB. P.387 P401 数值实现 Matlab 2019a ...

  3. 基于STM32F429的RGB屏使用

    使用ST的HAL库进行开发,RGB屏幕是480*272的4.3寸LCD,由于驱动RGB屏幕需要较多的内存, 所以使用了外部SDRAM,内存是32M字节,关于SDRAM的驱动本文不进行讨论. RGB屏幕 ...

  4. 基于apm、pix无人坦克、无人车自动控制与自动驾驶教程

    基于apm.pix无人坦克.无人车自动控制与自动驾驶教程 ** 目前玩无人机的玩家较多,但是无人车.无人机坦克的玩家少之又少,本人经过一段时间的琢磨,实现了无人车与无人坦克自动控制,自动驾驶,总控制系 ...

  5. 基于STM32F429和HAL库的CAN收发例程(原子阿波罗F429的CAN)可以依据他参考移植STM32F413程序

    基于STM32F429和HAL库的CAN收发例程 1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信 协议.在 ...

  6. STM32f429独立看门狗配置--基于HAL库

    STM32f429独立看门狗配置–基于HAL库 独立看门狗IWDG由专用的低速时钟LSI驱动,即使主时钟发生故障他仍然有效,但由于时钟LSI并不精确所以他适用于对时间精度要求低的场合,在喂狗的时候尽量 ...

  7. 《异常检测——从经典算法到深度学习》8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测

    <异常检测--从经典算法到深度学习> 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测 ...

  8. STM32软件学习笔记(一)基于HAL库的STM32F429单片机串口打印程序

    |版权声明:本文为博主原创文章,转载请注明出处.https://blog.csdn.net/NeverImagine_/article/details/95517664   目前ST官方有提供两种库文 ...

  9. 基于STM32F429的SDRAM使用

    使用ST的HAL库进行开发,SDRAM使用的是W9825G6KH-6. W9825G6KH-6共有4个Bank,13位行地址,9位列地址,位宽是16位, 所以芯片的容量是:4x8192x512x16= ...

  10. 基于微前端qiankun的多页签缓存方案实践

    作者:vivo 互联网前端团队- Tang Xiao 本文梳理了基于阿里开源微前端框架qiankun,实现多页签及子应用缓存的方案,同时还类比了多个不同方案之间的区别及优劣势,为使用微前端进行多页签开 ...

最新文章

  1. Meavn 搭建项目遇到Error creating bean with name 'sessionFactory' defined in class path resource...
  2. 3.顶点外扩方法实现的描边shader
  3. Js黑客帝国效果 文字下落 制作过程和思路
  4. MS SQL 能否修改实例名称
  5. Java——String类的方法
  6. APE结合键盘控制角色运动 转
  7. 英伟达有魔力,Uber小心翼翼 | 跟着开复去硅谷Day1
  8. php 操作系统,PHP 处理文件和操作系统
  9. ElasticSearch SQL 数据类型
  10. 2020汽车电子研究报告
  11. yoga710怎么进入bios_联想笔记本怎么进入BIOS联想手提电脑进BIOS方法汇总
  12. 上星远程控制实验(一)
  13. ibm大型机服务器虚拟化,PowerVM:IBM小型机虚拟化的利器
  14. 静态分析之数据流分析与 SSA 入门 (二)
  15. 5118站长工具箱:SEO数据分析浏览器插件 - 叶涛的博客
  16. NBA球员的选秀顺序和实际表现有多大差距?评估球员表现的VORP值又是怎么计算的?
  17. 解决xlrd不能打开xlsx表格以及打开失败问题
  18. 使用C#达到微信QQ自动快速发送信息的效果(刷屏)
  19. Linux指令--let
  20. java word 题目导入_java使用poi导入word题库

热门文章

  1. word压缩图片怎么弄_Word文档怎么压缩图片?Word图片压缩的方法介绍
  2. C语言 取绝对值函数abs()使用及注意事项
  3. 无人机倾斜摄影测量土方计算
  4. gopro7怎么回看视频_gopro7推荐帧数设置 gopro7视频格式设置
  5. 网上赚钱最快的方法 干什么能挣钱快
  6. 程序员老外通过编程赚钱的10个途径
  7. 清华大学出来的工资有多高?| 文末送书
  8. 怎么设置计算机网络访问权限,Win7无Internet访问权限怎么解决?
  9. 建立linux系统启动配置文件,linux下系统启动时,几个配置文件 启动顺序
  10. 如何打开后缀为.xps的文件?