STM32 USB学习整理2
usbd_usr.c
个人觉得这个文件里没有什么值得研究的东西!
只有那个中断服务函数有点价值,高速的时候应该有一个void OTG_HS_IRQHandler(void) ;
整个文件基本围绕 USR_cb 展开。
#include "usbd_usr.h"
#include "usb_dcd_int.h"
#include <stdio.h>
#include "usart.h"
#include "usbd_cdc_vcp.h"
//表示USB连接状态
//0,没有连接;
//1,已经连接;
vu8 bDeviceState=0; //默认没有连接
extern USB_OTG_CORE_HANDLE USB_OTG_dev;
//USB OTG 中断服务函数
//处理所有USB中断
void OTG_FS_IRQHandler(void) //全速中断服务
{
USBD_OTG_ISR_Handler(&USB_OTG_dev);//中断处理函数,处理一切中断
}
//指向DEVICE_PROP结构体
//USB Device 用户回调函数.
USBD_Usr_cb_TypeDef USR_cb =
{
USBD_USR_Init,
USBD_USR_DeviceReset,
USBD_USR_DeviceConfigured,
USBD_USR_DeviceSuspended,
USBD_USR_DeviceResumed,
USBD_USR_DeviceConnected,
USBD_USR_DeviceDisconnected,
};
//USB Device 用户自定义初始化函数
void USBD_USR_Init(void)
{
printf("USBD_USR_Init\r\n");
}
//USB Device 复位
//speed:USB速度,0,高速;1,全速;其他,错误.
void USBD_USR_DeviceReset (uint8_t speed)
{
switch (speed)
{
case USB_OTG_SPEED_HIGH:
printf("USB Device Library v1.1.0 [HS]\r\n");
break;
case USB_OTG_SPEED_FULL:
printf("USB Device Library v1.1.0 [FS]\r\n");
break;
default:
printf("USB Device Library v1.1.0 [??]\r\n");
break;
}
}
//USB Device 配置成功
void USBD_USR_DeviceConfigured (void)
{
bDeviceState=1;
printf("MSC Interface started.\r\n");
}
//USB Device挂起
void USBD_USR_DeviceSuspended(void)
{
bDeviceState=0;
printf("Device In suspend mode.\r\n");
}
//USB Device恢复
void USBD_USR_DeviceResumed(void)
{
printf("Device Resumed\r\n");
}
//USB Device连接成功
void USBD_USR_DeviceConnected (void)
{
bDeviceState=1;
printf("USB Device Connected.\r\n");
}
//USB Device未连接
void USBD_USR_DeviceDisconnected (void)
{
bDeviceState=0;
printf("USB Device Disconnected.\r\n");
}
usbd_desc.c
此文件主要提供USB字符串描述符,是对其他描述符的文字说明,且字符串描述符使用UNICODE编码,字符串描述符支持多国语言,当请求字符串描述符时需要使用16进制的 LANGID 来指定所期望的语言,以下程序中加入了一些自己理解的注释
#define USBD_VID /*供应商ID*/ 0x0483 /*STMicroelectronics*/
#define USBD_PID /*产品识别码*/ 0x5740
#define USBD_LANGID_STRING 0x409 /*语言 英语*/
#define USBD_MANUFACTURER_STRING "STMicroelectronics" /*意法半导体*/
#define USBD_PRODUCT_HS_STRING "ALIENTEK STM32F4/F7 Virtual COM" /*阿波罗F4虚拟串口*/
#define USBD_PRODUCT_FS_STRING "ALIENTEK STM32F4/F7 Virtual COM"
#define USBD_CONFIGURATION_HS_STRING "VCP Config"/*虚拟串口配置*/
#define USBD_CONFIGURATION_FS_STRING "VCP Config"
#define USBD_INTERFACE_HS_STRING "VCP Interface"/*虚拟串口接口*/
#define USBD_INTERFACE_FS_STRING "VCP Interface"
这个文件基本上也是围绕着 USR_desc 展开的:
#define USB_DEVICE_DESCRIPTOR_TYPE 0x01/*设备类*/
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02/*配置类*/
#define USB_STRING_DESCRIPTOR_TYPE 0x03/*字符串类*/
#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04/*接口类*/
#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05/*端点类*/
#define USB_SIZ_DEVICE_DESC 18 /* */
#define USB_SIZ_STRING_LANGID 4 /*字符串语言*/
USBD_DEVICE USR_desc =
{
USBD_USR_DeviceDescriptor,/*设备描述*/
USBD_USR_LangIDStrDescriptor, /*指定语言 语言标识*/
USBD_USR_ManufacturerStrDescriptor,/*制造商*/
USBD_USR_ProductStrDescriptor,/*产品*/
USBD_USR_SerialStrDescriptor,/*序列号*/
USBD_USR_ConfigStrDescriptor,/*配置*/
USBD_USR_InterfaceStrDescriptor,/*接口*/
};
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
#pragma data_alignment=4
#endif
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
/* USB Standard Device Descriptor USB标准设备描述符 18 个字节*/
__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
{
0x12, /*bLength 长度18 */
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType 设备类*/
0x00, /*bcdUSB */
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
0x00, /*bDeviceProtocol*/
USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize EP0的最大包长*/
LOBYTE(USBD_VID), /*idVendor VID低八位*/
HIBYTE(USBD_VID), /*idVendor VID高八位*/
LOBYTE(USBD_PID), /*idVendor PID低八位*/
HIBYTE(USBD_PID), /*idVendor PID高八位*/
0x00, /*bcdDevice rel. 2.00*/
0x02,
USBD_IDX_MFC_STR, /*Index of manufacturer string 厂商描述*/
USBD_IDX_PRODUCT_STR, /*Index of product string 产品描述字符串*/
USBD_IDX_SERIAL_STR, /*Index of serial number string 序列索引*/
USBD_CFG_MAX_NUM /*bNumConfigurations 当前速度下支持多少种配置(不就1种吗?还整这么神秘) */
} ; /* USB_DeviceDescriptor */
对这部分不是很感兴趣,就这样吧!