单片机学习小组
直播中

王越建

7年用户 1451经验值
私信 关注

如何利用stm32驱动ov5640摄像头?

如何利用STM32驱动ov5640摄像头?

回帖(1)

莫联雪

2022-2-22 09:42:25
stm32性能已经很强了, 可以驱动ov5640摄像头, 所以可以把摄像头接在stm32上, 当作一个摄像头驱动器, 连接到电脑上


1 stm32 USB 代码概览




u***_device.c 是描述注册, 回调注册

u***_desc.c 是描述符

u***d_crc_if.c 是u***d_crc.c的回调, 这是APP层, 包括初始化,控制,接受,发送的回调

u***d_cdc.c中是端点的初始化,输入的输入输出, 配置等

2 代码修改


主要修改u***d_desc.c中的描述

添加u***d_uvc.c 端口驱动

添加u***_uvc_if.c 回调







1 替换u***d_desc.c中的描述


因为u*** uvc的描述不一样, 这里需要设置为UVC的描述

2 添加u***d_uvc.c


这个文件主要是端口的读写, 还有配置描述

3

3 添加u***d_uvc_if.c






4 u***_device.c中注册


原本是CDC的注册,这里需要替换为UVC的注册

#include "u***d_uvc.h"
#include "u***d_uvc_if.h"
void MX_USB_DEVICE_Init(void)
{
  /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */

  /* USER CODE END USB_DEVICE_Init_PreTreatment */

  /* Init Device Library, add supported class and start the library. */
  if (USBD_Init(&hU***DeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK)
  {
    Error_Handler();
  }
      
      
//  if (USBD_RegisterClass(&hU***DeviceFS, &USBD_CDC) != USBD_OK)
//  {
//    Error_Handler();
//  }
//  if (USBD_CDC_RegisterInterface(&hU***DeviceFS, &USBD_Interface_fops_FS) != USBD_OK)
//  {
//    Error_Handler();
//  }
      
        if (USBD_RegisterClass(&hU***DeviceFS, &USBD_UVC) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_UVC_RegisterCamera(&hU***DeviceFS, &USBD_UVC_Camera) != USBD_OK)
  {
    Error_Handler();
  }
      
      
      
  if (USBD_Start(&hU***DeviceFS) != USBD_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */
  HAL_PWREx_EnableUSBVoltageDetector();

  /* USER CODE END USB_DEVICE_Init_PostTreatment */
}
5 更改u***d_conf.c中的初始化文件


     修改USB_LL_Init中的dma_enable, sof_enable 都改为ENABLE

hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
  hpcd_USB_OTG_FS.Init.dev_endpoints = 9;
  hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
  hpcd_USB_OTG_FS.Init.dma_enable = ENABLE;  // 开启DMA
  hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
  hpcd_USB_OTG_FS.Init.Sof_enable = ENABLE; // 开启sof_enable
  hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
  hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
  hpcd_USB_OTG_FS.Init.battery_charging_enable = DISABLE;
  hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE;
  hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
  if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK)
6 u***_uvc_if.c 添加摄像头图片数据


摄像头设置的是YUV420P的格式, 不是RGB565的数据,这里要注意

我这里还没接入摄像头,就用模拟数据代替, 如果接入了摄像头直接把图片缓冲区地址放这里

7 测试




因为没接入摄像头所以模拟一张图片来显示







举报

更多回帖

发帖
×
20
完善资料,
赚取积分