第45章dcmi—ov2640摄像头—零死角玩转stm32-f429系列

第45章dcmi—ov2640摄像头—零死角玩转stm32-f429系列

在这篇文章中,我将介绍如何在STM32-F429系列微控制器上使用DCMI-OV2640摄像头。我们将展示如何捕捉视频流和录制图像,并将它们显示在TFT显示屏上,以及使用DMA传输数据。最终,我们能够实现零死角观看实时视频。

硬件配置

要实现这个项目,我们需要以下硬件组件:

  • STM32F429I-DISC1开发板
  • OV2640摄像头模块
  • ILI9341 TFT显示器

连接摄像头模块到开发板的DCMI接口。接下来,将TFT显示器连接到开发板的TFT接口。

软件配置

为了编写代码,我们需要安装STM32CubeIDE。将库文件添加到我们的项目中,以及创建所需的数据类型和变量。

/* Size of the frame */
#define IMG_WIDTH  320
#define IMG_HEIGHT 240

/* DMA buffer memory */
#define DMA_BUFFER_SIZE          ((uint32_t)(IMG_HEIGHT*IMG_WIDTH*2))

/* DCMI buffer memory */
ALIGN_32BYTES(uint8_t output_frame_buffer[IMG_HEIGHT][IMG_WIDTH*2]);

启动DCMI

启动DCMI的第一步是读取摄像头的ID。如果成功返回ID,我们就可以开始配置和启动DCMI。

/* Initialize the OV2640 camera module */
uint8_t CAMERA_Init(void) {
    uint8_t value = 0xFF;

    /*Read ID of Camera module via I2C*/
    ......
    if(CAMERA_ReadID() == OV2640_ID) {
        /*Configure the DCMI to interface with the OV2640 camera module*/
        ......
    }
    else {
        /* Camera module is not detected, abort */
        return 0;
    }
    return 1;
}

开始捕捉

使用以下代码开始捕捉视频流并将其存储在缓冲区中:

/**
  * @brief  Start the DMA transfer
  * @param  None
  * @retval None
  */
static void Start_DMA_Transfer(void)
{ 
  /* Configure the DMA2_Stream1 channel1 to transfer data from DCMI to the LCD */
  ......

  /* Clear Transfer complete flag */
  __HAL_DMA_CLEAR_FLAG(&hdma_dcmi, DMA_FLAG_TCIF1);

  /* Enable the DMA2_Stream1 channel */
  HAL_DMA_Start_IT(&hdma_dcmi, (uint32_t)&DCMI->DR, (uint32_t)output_frame_buffer, DMA_BUFFER_SIZE); 

  /* Start the DCMI Snapchot mode */
  DCMI_SnapshotMode_Enable(); 
  DCMI_Cmd(ENABLE);
}

显示视频流

通过将缓冲区中的数据传输到TFT屏幕,我们可以实现将视频流实时显示在屏幕上。

/**
  * @brief  Manages the DMA Transfer
  * @param  None
  * @retval None
  */
void BSP_LCD_DMA2D_IRQHandler(void)
{
  /*Transfer of DMA Finished*/
  if(LL_DMA_IsActiveFlag_TC2(DMA2_Stream0))
  {
    LL_DMA_ClearFlag_TC2(DMA2_Stream0);
    /*Convert Picture to ARGB8888 to Display On LCD*/
    DMA2D_CopyBuffer((uint32_t *)output_frame_buffer, (uint32_t *)BSP_LCD_GetFrameBuffer(), IMG_WIDTH, IMG_HEIGHT);      
  }
}

总结

在这篇文章中,我们学习了如何在STM32F429I-DISC1上使用DCMI和OV2640摄像头。我们成功地捕获了视频流,将其显示在了TFT显示器上,并实现了零死角观看实时视频的功能。参考我们的代码并开始实现你自己的项目吧!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:第45章dcmi—ov2640摄像头—零死角玩转stm32-f429系列 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • Go语言创建、初始化数组的常见方式汇总

    Go语言创建、初始化数组的常见方式汇总 在Go语言中,创建和初始化数组有很多种方式,本文将介绍常见的几种方式。 通过指定长度创建数组 语法:var 数组名 [数组长度]数组类型 示例代码: var arr [3]int 上述代码创建了一个长度为3,类型为int的空数组。可根据需要更改长度及其类型。 通过指定初始值创建数组 语法:数组名 := [数组长度]数组…

    other 2023年6月20日
    00
  • PHP进阶学习之命名空间基本用法分析

    PHP进阶学习之命名空间基本用法分析 命名空间的作用 在PHP中,命名空间是一种封装代码的机制,可以通过定义命名空间将一个或多个PHP类、函数等代码元素隔离在一起,避免命名冲突,提高代码的可维护性。 命名空间的定义 在 PHP 中,命名空间通过 namespace 关键字来定义,格式如下: namespace NamespaceName; 其中,Namesp…

    other 2023年6月27日
    00
  • Android中Fragmen首选项使用自定义的ListPreference的方法

    下面是针对于“Android中Fragmen首选项使用自定义的ListPreference的方法”的完整攻略,并且给出两个示例说明。 步骤1:新建一个自定义的ListPreference 在res/xml文件夹下创建一个名为preferences.xml的xml文件,用于存放自定义的ListPreference。 在preferences.xml文件中添加以…

    other 2023年6月26日
    00
  • qq语音视频聊天没有声音(对方听不到我的声音)的解决方案

    qq语音视频聊天没有声音的解决方案 如果在使用QQ语音视频聊天时出现对方听不到我的声音的情况,可能是以下原因造成的: 电脑麦克风或扬声器的设置有误。 QQ软件设置有误。 系统设置中麦克风或扬声器被禁用。 接下来,我们将分别介绍以上三种情况的解决方案。 电脑麦克风或扬声器的设置有误 如果电脑麦克风或扬声器的音量过小,或者麦克风被关闭,就会出现对方听不到你的声音…

    other 2023年6月26日
    00
  • CentOS 6.3 Rsync客户端与Win2003 cwRsyncServer服务端实现数据同步

    下面我将详细讲解“CentOS 6.3 Rsync客户端与Win2003 cwRsyncServer服务端实现数据同步”的完整攻略,具体步骤如下: 确认准备工作 首先要确认准备工作是否齐备,以下是需要准备的内容: CentOS 6.3系统及cwRsync客户端 Win2003系统及cwRsyncServer服务端 确认两台机器之间网络通畅 在Win2003上…

    other 2023年6月27日
    00
  • 关于Spring启动流程及Bean生命周期梳理

    关于Spring启动流程及Bean生命周期梳理 Spring启动流程 在Spring应用程序启动时,Spring框架会完成一系列的初始化工作。具体而言,Spring启动流程如下: 加载配置文件:Spring框架首先会读取应用程序中的配置文件。对于基于XML的配置来说,通常是读取applicationContext.xml文件。对于基于Java的配置来说,通常…

    other 2023年6月27日
    00
  • vue挂载元素的替换

    Vue挂载元素的替换 在Vue的开发中,我们经常需要动态地替换某一个元素,比如将一个标签替换成 标签,或者将一个 标签替换成标签等等。本文将介绍Vue中如何实现元素的替换。 使用v-if指令 Vue提供了一个非常方便的指令v-if,用于根据条件动态地控制元素的显示和隐藏。通过将待替换的元素和替换后的元素都分别放在两个<template>标签里,并…

    其他 2023年3月28日
    00
  • vue将数字转为中文大写金额方式

    Vue将数字转为中文大写金额方式攻略 步骤一:创建过滤器 首先,在Vue应用中创建一个过滤器,用于将数字转换为中文大写金额的方式。在Vue组件中的filters选项中添加以下代码: filters: { toChineseAmount(value) { // 将数字转换为中文大写金额的逻辑代码 // … // 返回转换后的中文大写金额 return co…

    other 2023年8月18日
    00
合作推广
合作推广
分享本页
返回顶部