# usb **Repository Path**: liangmu-classmate/usb ## Basic Information - **Project Name**: usb - **Description**: usb初次尝试 - **Primary Language**: Unknown - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2023-09-08 - **Last Updated**: 2023-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: 单片机, usb ## README # usb #### 介绍 usb初次尝试,STM32F1 USB通信,以独立按键代替键盘 #### 软件 MDK5 CubeMX #### 使用流程 /* main.c里定义数组: uint8_t USB_buff[8]; 各位内容如下: buff[0] bit0:left CTRL bit1:left shift bit2:left ALT bit3:left WIN bit4:right CTRL bit5:right SHIFT bit6:right ALT bit7:right WIN buff[1] 保留位 buff[2] 自定义键1 buff[3] 自定义键2 buff[4] 自定义键3 buff[5] 自定义键4 buff[6] 自定义键5 buff[7] 自定义键6 修改: usbd_hid.c: 1、 __ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END 函数里替换描述符为以下内容: 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 用途为键盘 0xA1, 0x01, // COLLECTION (Application) 表示应用结合,必须以END_COLLECTION来结束 0x05, 0x07, // USAGE_PAGE (Keyboard) 用途页为按键 0x19, 0xE0, // USAGE_MINIMUM (Keyboard LeftControl) 用途最小值 左Ctrl 0x29, 0xE7, // USAGE_MAXIMUM (Keyboard Right GUI) 用途最大值 右GUI 0x15, 0x00, // LOGICAL_MINIMUM (0) 逻辑最小值 0 0x25, 0x01, // LOGICAL_MAXIMUM (1) 逻辑最大值 1 0x75, 0x01, // REPORT_SIZE (1) 报告位大小(这个字段的宽度为1bit) 0x95, 0x08, // REPORT_COUNT (8) 输入报告第一个字节(报告位大小 8bit) 0x81, 0x02, // INPUT (Data,Var,Abs) 报告为输入用 , 从左ctrl到右GUI 8bit刚好构成1个字节 0x95, 0x01, // REPORT_COUNT (1) 报告位数量 1个 0x75, 0x08, // REPORT_SIZE (8) 输入报告的第二给字节(报告位大小 8bit) 0x81, 0x03, // INPUT (Cnst,Var,Abs) 输入用的保留位,设备必须返回0 0x95, 0x05, // REPORT_COUNT (5) 报告位数量 5个 0x75, 0x01, // REPORT_SIZE (1) 报告位大小,1bit 0x05, 0x08, // USAGE_PAGE (LEDs) 用途为LED 0x19, 0x01, // USAGE_MINIMUM (Num Lock) 用途最小值 NUM Lock LED灯 0x29, 0x05, // USAGE_MAXIMUM (Kana) 用途最大值 Kana 灯 0x91, 0x02, // OUTPUT (Data,Var,Abs) 输出用途,用于控制LED等 0x95, 0x01, // REPORT_COUNT (1) 报告位数量 1个 0x75, 0x03, // REPORT_SIZE (3) 报告位大小 3bit 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) 用于字节补齐,跟前面5个bit进行补齐 0x95, 0x06, // REPORT_COUNT (6) 报告位数量 6个 0x75, 0x08, // REPORT_SIZE (8) 报告位大小 8bit 0x15, 0x00, // LOGICAL_MINIMUM (0) 逻辑最小值0 0x25, 0x65, // LOGICAL_MAXIMUM (255) 逻辑最大值255 0x05, 0x07, // USAGE_PAGE (Keyboard) 用途页为按键 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 使用值最小为0 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 使用值最大为65 0x81, 0x00, // INPUT (Data,Ary,Abs) 输入用,变量,数组,绝对值 0xc0 2、__ALIGN_BEGIN static uint8_t USBD_HID_OtherSpeedCfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END 函数内,修改以下内容为keyboard 0x01, nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse 3、usbd_hid.h 修改以下内容为: #define HID_EPIN_SIZE 0x08U #define HID_MOUSE_REPORT_DESC_SIZE 63U 声明: mian.c里边 uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev,uint8_t *report,uint16_t len); extern USBD_HandleTypeDef hUsbDeviceFS; 发送 USBD_HID_SendReport(&hUsbDeviceFS,USB_buff,8); */