STM32 USB HID 组合设备(配置多个接口)

本文详细介绍了如何在STM32F767IGTx上配置USB复合设备,包括USB配置描述符的设置,以及解决接口枚举失败的问题。通过修改配置描述符、接口描述符、HID描述符和端点描述符,最终实现了多个HID接口的正确枚举。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

USB Compound Device,USB复合设备
USB Composite Device,USB组合设备

 

USB Composite Device,不内嵌Hub,几个设备的PID和VID都是相同

 

此文均在STM32F767IGTx已实现普通custom HID工程上做解释。

//usb配置描述符
/* USB CUSTOM_HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09, /* bLength: 长度,设备字符串的长度为9字节 */
  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: 类型,配置描述符的类型 */
  USB_CUSTOM_HID_CONFIG_DESC_SIZ, /* wTotalLength: 配置描述符的总长度 */
  0x00,
  0x01,         /*bNumInterfaces: 配置所支持的接口数量1个*/
  0x01,         /*bConfigurationValue: 该配置的值*/
  0x00,         /*iConfiguration: 该配置的字符串的索引值,该值为0表示没有字符串*/
  0xC0,         /*bmAttributes: bus powered */
  0x32,         /*MaxPower 100 mA: 从总线上获得的最大电流为100mA*/

  /************** 接口描述符 ****************/
  /* 09 */
  0x09,         /*bLength: 长度,接口描述符的长度为9字节 */
  USB_DESC_TYPE_INTERFACE,/*bDescriptorType: 接口描述符的类型*/
  0x00,         /*bInterfaceNumber: 该接口的编号*/
  0x00,         /*bAlternateSetting: 该接口的备用编号*/
  0x02,         /*bNumEndpoints: 该接口所使用的端点数*/
  0x03,         /*bInterfaceClass: 该接口所使用的类为HID*/
  0x00,         /*bInterfaceSubClass : 该接口所用的子类 1=BOOT, 0=no boot*/
  0x00,         /*nInterfaceProtocol : 该接口使用的协议 0=none, 1=keyboard, 2=mouse*/
  0,            /*iInterface: 该接口字符串的索引*/
  /******************** HID描述符 *************************/
  /* 18 */
  0x09,         /*bLength: HID描述符的长度为9字节*/
  CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID的描述符类型*/
  0x11,         /*bCUSTOM_HIDUSTOM_HID: HID协议的版本*/
  0x01,
  0x00,         /*bCountryCode: 国家代号*/
  0x01,         /*bNumDescriptors: 下级描述符的数量*/
  0x22,         /*bDescriptorType: 下级描述符的类型*/
  USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: 下一集描述符的长度*/
  0x00,
  /******************** 输入端点描述符 ********************/
  /* 27 */
  0x07,          /*bLength: 端点描述符的长度为7字节*/
  USB_DESC_TYPE_ENDPOINT, /*bDescriptorType: 端点描述符的类型*/
  CUSTOM_HID_EPIN_ADDR, /*bEndpointAddress: 该端点(输入)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/
  0x03, /*bmAttributes: 端点的属性为为中断端点. D0~D1表示传输类型:0(控制传输),
			1(等时传输),2(批量传输),3(中断传输) 非等时传输端点:D2~D7:保留为0 等时传输端点: 
			D2~D3表示同步的类型:0(无同步),1(异步),2(适配),3(同步) D4~D5表示用途:0(数据端点),
			1(反馈端点),2(暗含反馈的数据端点),3(保留),D6~D7:保留,*/
  CUSTOM_HID_EPIN_SIZE, /*wMaxPacketSize: 该端点支持的最大包长度 */
  0x00,
  0x01,//0x20,          /*bInterval: 轮询间隔*/
  /* 34 */
  /******************** 输出端点描述符 ********************/
  0x07,	         /* bLength: 端点描述符的长度为7字节 */
  USB_DESC_TYPE_ENDPOINT,	/* bDescriptorType: 端点描述符的类型 */
  CUSTOM_HID_EPOUT_ADDR,  /*bEndpointAddress: 该端点(输入)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/
  0x03,	/* bmAttributes: 端点的属性为为中断端点. D0~D1表示传输类型:0(控制传输),1(等时传输),
			2(批量传输),3(中断传输) 非等时传输端点:D2~D7:保留为0 等时传输端点: 
			D2~D3表示同步的类型:0(无同步),1(异步),2(适配),3(同步) D4~D5表示用途:0(数据端点),
			1(反馈端点),2(暗含反馈的数据端点),3(保留),D6~D7:保留 */
  CUSTOM_HID_EPOUT_SIZE,	/* wMaxPacketSize: 该端点支持的最大包长度  */
  0x00,
  0x01,
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值