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 测试
因为没接入摄像头所以模拟一张图片来显示。
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 测试
因为没接入摄像头所以模拟一张图片来显示。
举报