基于STM32F103的USB学习笔记27 - CustomHID

基于JoyStickMouse例程修改即可。

1. 调整描述符

设备描述符可以不用改。

配置描述符长度改为41,主要是增加一个端点。

#define USB_CONFIG_DESC_LEN                     41

配置描述符集合中的Interfae描述符修改如下,

    0x09,         /*bLength: Interface Descriptor size*/
    USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
    0x00,         /*bInterfaceNumber: Number of Interface*/
    0x00,         /*bAlternateSetting: Alternate setting*/
    0x02,         /*bNumEndpoints*/
    0x03,         /*bInterfaceClass: HID*/
    0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
    0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
    0,            /*iInterface: Index of string descriptor*/

配置描述符集合中的端点描述符修改:

/******************** Descriptor of CustomHID endpoint ********************/
    /* 27 */
    0x07,          /*bLength: Endpoint Descriptor size*/
    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

    0x81,          /*bEndpointAddress: Endpoint Address (IN)*/
    0x03,          /*bmAttributes: Interrupt endpoint*/
    0x40,          /*wMaxPacketSize: 64 Byte max */
    0x00,
    0x0a,//0x20,          /*bInterval: Polling Interval (32 ms)*/
    /* 34 */
    0x07,          /*bLength: Endpoint Descriptor size*/
    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

    0x01,          /*bEndpointAddress: Endpoint Address (OUT)*/
    0x03,          /*bmAttributes: Interrupt endpoint*/
    0x40,          /*wMaxPacketSize: 64 Byte max */
    0x00,
    0x0a,//0x20,          /*bInterval: Polling Interval (32 ms)*/

配置描述符集合中的HID描述符需要和Report描述符一起配合改。

const uint8_t hidReportDescriptor[HID_REPORT_DESC_LEN] =
{
    /* USER CODE BEGIN 0 */
    0x05, 0x8c, /* USAGE_PAGE (ST Page) */
    0x09, 0x01, /* USAGE (Demo Kit) */
    0xa1, 0x01, /* COLLECTION (Application) */
 
    // The Input report
    0x09,0x03, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8bit)
    0x95,0x40, // REPORT_COUNT (64Byte)
    0x81,0x02, // INPUT (Data,Var,Abs)
 
    // The Output report
    0x09,0x04, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8bit)
    0x95,0x40, // REPORT_COUNT (64Byte)
    0x91,0x02, // OUTPUT (Data,Var,Abs)
 
    /* USER CODE END 0 */
    0xC0    /*     END_COLLECTION                 */
}; 

修改HID描述符中描述Report描述符的长度

/* 18 */
    0x09,         /*bLength: HID Descriptor size*/
    HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
    0x10,         /*bcdHID: HID Class Spec release number*/
    0x01,
    0x00,         /*bCountryCode: Hardware target country*/
    0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
    HID_REPORT_DESCRIPTOR_TYPE,         /*bDescriptorType*/
    HID_REPORT_DESC_LEN,/*wItemLength: Total length of Report descriptor*/
    0x00,

即#define HID_REPORT_DESC_LEN                     33

字符串描述符可以根据需要修改。

2. 调整PMA地址分配,RX和TX都分配64字节。

#define ENDP1_TXADDR        (0x100)
#define ENDP1_RXADDR        (0x140)

然后在Reset里面修改端点的初始化参数

    SetEPType(ENDP1, EP_INTERRUPT);
    SetEPTxAddr(ENDP1, ENDP1_TXADDR);
    SetEPRxAddr(ENDP1, ENDP1_RXADDR);
    SetEPTxCount(ENDP1, 64);
    SetEPRxCount(ENDP1, 64);
    SetEPRxStatus(ENDP1, EP_RX_VALID);
    SetEPTxStatus(ENDP1, EP_TX_NAK);

3. 根据项目需求修改EP1的读写函数,这里只是读取64字节数据,然后打印第1个字节和第64个字节

void EP1_OUT_Callback(void)
{
    uint8_t buf[64];
    buf[0] = 0;
    buf[63] = 0;
    USB_SIL_Read(EP1_OUT, buf);
    SetEPRxStatus(ENDP1, EP_RX_VALID);
    Printf("buf[0] = 0x%x, buf[63] = 0x%x\r\n", buf[0], buf[63]);
}

发送数据改为发送64字节

/* Copy mouse position info in ENDP1 Tx Packet Memory Area*/
USB_SIL_Write(EP1_IN, txBuffer, 64);

/* Enable endpoint for transmission */
SetEPTxValid(ENDP1);

4. 使用单片机多功能调试助手调试

发送实验:

基于STM32F103的USB学习笔记27 - CustomHID_第1张图片

接收实验:

基于STM32F103的USB学习笔记27 - CustomHID_第2张图片

你可能感兴趣的:(MCU编程,USB)