STM32
直播中

李梅

7年用户 1366经验值
私信 关注
[问答]

stm32是怎样驱动ov5640摄像头并连接到电脑上的

STM32是怎样驱动ov5640摄像头并连接到电脑上的?其步骤有哪些?

回帖(1)

王博

2021-12-8 11:59:26
stm32性能已经很强了, 可以驱动ov5640摄像头, 所以可以把摄像头接在stm32上, 当作一个摄像头驱动器, 连接到电脑上
开发环境: stm32cubemx 6.0.1
单片机: 自己做的stm32h743iit6核心板,兼容正点原子
整个项目是基于CDC串口上修改
  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
完善资料,
赚取积分