STM32开发板上有USB HS与FS各一个,还有一个是STLINK调试接口。其中USB1是HS OTG。
CubeMx自动生成的HID 鼠标的描述:
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = { 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ 0x09, 0x02, /* Usage (Mouse) */ 0xA1, 0x01, /* Collection (Application) */ 0x09, 0x01, /* Usage (Pointer) */ 0xA1, 0x00, /* Collection (Physical) */ 0x05, 0x09, /* Usage Page (Button) */ 0x19, 0x01, /* Usage Minimum (0x01) */ 0x29, 0x03, /* Usage Maximum (0x03) */ 0x15, 0x00, /* Logical Minimum (0) */ 0x25, 0x01, /* Logical Maximum (1) */ 0x95, 0x03, /* Report Count (3) */ 0x75, 0x01, /* Report Size (1) */ 0x81, 0x02, /* Input (Data,Var,Abs) */ 0x95, 0x01, /* Report Count (1) */ 0x75, 0x05, /* Report Size (5) */ 0x81, 0x01, /* Input (Const,Array,Abs) */ 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ 0x09, 0x30, /* Usage (X) */ 0x09, 0x31, /* Usage (Y) */ 0x09, 0x38, /* Usage (Wheel) */ 0x15, 0x81, /* Logical Minimum (-127) */ 0x25, 0x7F, /* Logical Maximum (127) */ 0x75, 0x08, /* Report Size (8) */ 0x95, 0x03, /* Report Count (3) */ 0x81, 0x06, /* Input (Data,Var,Rel) */ 0xC0, /* End Collection */ 0x09, 0x3C, /* Usage (Motion Wakeup) */ 0x05, 0xFF, /* Usage Page (Reserved 0xFF) */ 0x09, 0x01, /* Usage (0x01) */ 0x15, 0x00, /* Logical Minimum (0) */ 0x25, 0x01, /* Logical Maximum (1) */ 0x75, 0x01, /* Report Size (1) */ 0x95, 0x02, /* Report Count (2) */ 0xB1, 0x22, /* Feature (Data,Var,Abs,NoWrp) */ 0x75, 0x06, /* Report Size (6) */ 0x95, 0x01, /* Report Count (1) */ 0xB1, 0x01, /* Feature (Const,Array,Abs,NoWrp) */ 0xC0 /* End Collection */ };
在应用代码中添加:
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* Enable the CPU Cache */ /* Enable I-Cache---------------------------------------------------------*/ SCB_EnableICache(); /* Enable D-Cache---------------------------------------------------------*/ SCB_EnableDCache(); /* MCU Configuration--------------------------------------------------------*/ /* Update SystemCoreClock variable according to RCC registers values. */ SystemCoreClockUpdate(); /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USB_DEVICE_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(LD2_ORANGE_GPIO_Port, LD2_ORANGE_Pin); HAL_Delay(1000); if(flag_userButton_Pressed == 1){ buff[0] = 0x02; USBD_HID_SendReport(&hUsbDeviceHS, buff, sizeof(buff)); HAL_Delay(100); buff[0] = 0x00; USBD_HID_SendReport(&hUsbDeviceHS, buff, sizeof(buff)); flag_userButton_Pressed = 0; } } /* USER CODE END 3 */ }
其中flag_userButton_Pressed 标志位是在按键的ISR中进行置位的。