前言

查阅网上的博客与代码,很多都是关于USB的鼠标配置、USB的键盘配置、USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因为不理解这些数字代表着什么。但只要理解每个数字代表什么意思,想错都难,干货满满,和我一起学习吧


1、STM32 usbdesc.c USB描述符配置

1.1、设备描述符

/* USB Standard Device Descriptor */
const uint8_t Mouse_DeviceDescriptor[Mouse_SIZ_DEVICE_DESC] ={0x12,                       /*bLength */USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/0x00,                       /*bcdUSB */0x02,0xEF,                       /*bDeviceClass*/0x02,                       /*bDeviceSubClass*/0x01,                       /*bDeviceProtocol*/0x40,                       /*bMaxPacketSize40*/0x83,                       /*idVendor (0x0483)*/0x04,0x10,                       /*idProduct = 0x5710*/0x57,0x00,                       /*bcdDevice rel. 2.00*/0x02,1,                          /*Index of string descriptor describingmanufacturer */2,                          /*Index of string descriptor describingproduct*/3,                          /*Index of string descriptor describing thedevice serial number */0x01                        /*bNumConfigurations*/}; /* Mouse_DeviceDescriptor */

其一,组合设备需要对设备描述符修改为0xEF,0x02,0x01,若想了解这三个参数可以百度了解一下,里面有详细的介绍,这里不做说明。

看起来很懵对吧,其实很多值是固定的不需要修改,只有几项需要修改而已。而且这个配置不随着增加设备或减少设备而改变,配置好后不需要修改,嫌麻烦直接复制上面设备描述符代码就好,兼容性很强。

1.2、配置描述符

const uint8_t Mouse_ConfigDescriptor[Mouse_SIZ_CONFIG_DESC] =
{配置描述符   //Configuration Descriptor 只能有1个/*功能1 HID键盘*/IAD描述符    //复合设备才有 在单接口的设备这个可以不要接口1描述符   //Interface Descriptor类描述符    //Class Desdriptor端点描述符  //Endpoint Descriptor/*功能2 HID鼠标*/IAD描述符    //复合设备才有 在单接口的设备这个可以不要接口2描述符   //Interface Descriptor类描述符    //Class Desdriptor端点描述符  //Endpoint Descriptor/*功能3 虚拟串口*/  IAD描述符    //复合设备才有 在单接口的设备这个可以不要接口3描述符   //Interface Descriptor类描述符    //Class Desdriptor端点描述符  //Endpoint Descriptor/*如果有多个接口 下面还可以继续添加*/...
}

举例说明:鼠标+键盘+虚拟串口

const uint8_t Mouse_ConfigDescriptor[Mouse_SIZ_CONFIG_DESC] ={0x09, /* bLength: Configuation Descriptor size */USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */Mouse_SIZ_CONFIG_DESC,/* wTotalLength: Bytes returned */0x00,0x04,         /*bNumInterfaces: 4 interface*/设备总数0x01,         /*bConfigurationValue: Configuration value*/必须为0x01,或者更高0x00,         /*iConfiguration: Index of string descriptor describingthe configuration*/字符串索引,若没有字符串描述符,这个字段为00x80,         /*bmAttributes: bus powered */0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*//*************************************功能1 HID键盘**************************************//*IAD描述符*/0x08,   //bLength:IAD描述符大小 0x0B,   //bDescriptorType:IAD描述符类型0x00,   //bFirstInterface:功能1 HID键盘的第一个接口描述符是在总的配置描述符中的第几个从0开始数0x01,   //bInferfaceCount:功能1 HID键盘有1个接口描述符0x03,   //bFunctionClass:同单HID功能时,设备符中的bDeviceClass0x00,   //bFunctionSubClass:同单HID功能时,设备符中的bDeviceSubClass0x00,   //bFunctionProtocol:同单HID功能时,设备符中的bDeviceProtocol0x01,   //iFunction:字符串描述中关于此设备的索引(个人理解是一个字符串描述符中有比如0~5是功能1的字符串,//6~10是功能2的字符串,如果是功能2的话,此值为6)/*******************第一个接口描述符*********************/0x09,  //bLength字段0x04,    //bDescriptorType字段0x00,    /*bInterfaceNumber字段*/从0开始编号0x00,   /*bAlternateSetting字段*/必须为0x000x02, /*bNumEndpoints字段*/表示接口描述符有多少个端点0x03,   /*bInterfaceClass字段*/设备类型,例如HID、VCP、CDC0x01, /*bInterfaceSubClass字段*/0x00代表No subclass,0x01代表Boot Interface subclass0x01, /*bInterfaceProtocol字段*/0x00 None,0x01 keyboard,0x02 mouse,3~255 reserved0x00, //iConfiguration字段/******************HID描述符************************/0x09,   //bLength字段0x21,    //bDescriptorType字段0x10,    /*bcdHID字段*/设备遵循的HID版本号0x01,0x21,   /*bCountyCode字段*/语言0x01,    /*bNumDescriptors字段*/下级报告描述符数量,至少为1,0x010x22, /*bDescriptorType字段*/报告描述符必须为0x22//bDescriptorLength字段。//下级描述符的长度。下级描述符为键盘报告描述符。sizeof(KeyboardReportDescriptor)&0xFF,(sizeof(KeyboardReportDescriptor)>>8)&0xFF,/**********************输入端点描述符***********************/0x07,  //bLength字段0x05,    //bDescriptorType字段0x81,    /*bEndpointAddress字段*/端口的地址bit 3~0:端口号bit 7  :0 输入端口(主机到设备)1 输出端口(设备到主机)0x03, //bmAttributes字段0x10,   //wMaxPacketSize字段0x00,0x0A,    //bInterval字段/**********************输出端点描述符***********************/0x07,    //bLength字段0x05,    //bDescriptorType字段0x01,    //bEndpointAddress字段0x03,   //bmAttributes字段0x10,   //wMaxPacketSize字段0x00,0x0A,    //bInterval字段  /*IAD描述符*/0x08,   //bLength:IAD描述符大小 0x0B,   //bDescriptorType:IAD描述符类型0x01,   //bFirstInterface:功能1 HID键盘的第一个接口描述符是在总的配置描述符中的第几个从0开始数0x01,   //bInferfaceCount:功能1 HID键盘有1个接口描述符0x03,   //bFunctionClass:同单HID功能时,设备符中的bDeviceClass0x00,   //bFunctionSubClass:同单HID功能时,设备符中的bDeviceSubClass0x00,   //bFunctionProtocol:同单HID功能时,设备符中的bDeviceProtocol0x01,   //iFunction:字符串描述中关于此设备的索引(个人理解是一个字符串描述符中有比如0~5是功能1的字符串,//6~10是功能2的字符串,如果是功能2的话,此值为6)/************** Descriptor of Mouse Mouse interface ****************//* 09 */0x09,         /*bLength: Interface Descriptor size*/USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/0x01,         /*bInterfaceNumber: Number of Interface*/0x00,         /*bAlternateSetting: Alternate setting*/0x01,         /*bNumEndpoints*/0x03,         /*bInterfaceClass: HID*/0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/0x02,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/0,            /*iInterface: Index of string descriptor*//******************** Descriptor of Mouse Mouse HID ********************//* 18 */0x09,         /*bLength: HID Descriptor size*/HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/0x10,         /*bcdHID: HID Class Spec release number*/0x01,0x21,         /*bCountryCode: Hardware target country*/0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/0x22,         /*bDescriptorType*/Mouse_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/0x00,/******************** Descriptor of Mouse Mouse endpoint ********************//* 27 */0x07,          /*bLength: Endpoint Descriptor size*/USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/0x82,          /*bEndpointAddress: Endpoint Address (IN)*/0x03,          /*bmAttributes: Interrupt endpoint*/0x40,          /*wMaxPacketSize: 4 Byte max */0x00,0x0A,          /*bInterval: Polling Interval (32 ms)*//* 34 *//*IAD描述符 66*//* Interface Association Descriptor(IAD Descriptor)  */ 0x08,   /*  bLength  */0x0B,   /*  bDescriptorType*/0x02,   /*  bFirstInterface*/0x02,   /*  bInterfaceCount*/0x02,   /*  bFunctionClass --CDC*/0x02,   /*  bFunctionSubClass*/0x01,   /*  bFunctionProtocoll*/0x00,   /*  iFunction */  /*Interface Descriptor*/0x09,   /* bLength: Interface Descriptor size */USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface *//* Interface descriptor type */0x02,   /* bInterfaceNumber: Number of Interface */0x00,   /* bAlternateSetting: Alternate setting */0x01,   /* bNumEndpoints: One endpoints used */0x02,   /* bInterfaceClass: Communication Interface Class */0x02,   /* bInterfaceSubClass: Abstract Control Model */0x01,   /* bInterfaceProtocol: Common AT commands */0x00,   /* iInterface: *//*Header Functional Descriptor*/0x05,   /* bLength: Endpoint Descriptor size */0x24,   /* bDescriptorType: CS_INTERFACE */0x00,   /* bDescriptorSubtype: Header Func Desc */0x10,   /* bcdCDC: spec release number */0x01,/*Call Managment Functional Descriptor*/0x05,   /* bFunctionLength */0x24,   /* bDescriptorType: CS_INTERFACE */0x01,   /* bDescriptorSubtype: Call Management Func Desc */0x00,   /* bmCapabilities: D0+D1 */0x01,   /* bDataInterface: 1 *//*ACM Functional Descriptor*/0x04,   /* bFunctionLength */0x24,   /* bDescriptorType: CS_INTERFACE */0x02,   /* bDescriptorSubtype: Abstract Control Management desc */0x02,   /* bmCapabilities *//*Union Functional Descriptor*/0x05,   /* bFunctionLength */0x24,   /* bDescriptorType: CS_INTERFACE */0x06,   /* bDescriptorSubtype: Union func desc */0x00,   /* bMasterInterface: Communication class interface */0x01,   /* bSlaveInterface0: Data Class Interface *//*Endpoint 2 Descriptor*/0x07,   /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */0x85,   /* bEndpointAddress: (IN5) */0x03,   /* bmAttributes: Interrupt */0x40,      /* wMaxPacketSize: */0x00,0xFF,   /* bInterval: *//*Data class interface descriptor*/0x09,   /* bLength: Endpoint Descriptor size */USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */0x03,   /* bInterfaceNumber: Number of Interface */0x00,   /* bAlternateSetting: Alternate setting */0x02,   /* bNumEndpoints: Two endpoints used */0x0A,   /* bInterfaceClass: CDC */0x00,   /* bInterfaceSubClass: */0x00,   /* bInterfaceProtocol: */0x00,   /* iInterface: *//*Endpoint 3 Descriptor*/0x07,   /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */0x06,   /* bEndpointAddress: (OUT6) */0x02,   /* bmAttributes: Bulk */0x40,             /* wMaxPacketSize: */0x00,0x00,   /* bInterval: ignore for Bulk transfer *//*Endpoint 1 Descriptor*/0x07,   /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */0x87,   /* bEndpointAddress: (IN7) */0x02,   /* bmAttributes: Bulk */0x40,             /* wMaxPacketSize: */0x00,0x00    /* bInterval */}

需要注意的点
1、 配置描述符中0x04, /*bNumInterfaces: 4 interface*/ 必须与设备个数相等。
2、 每个设备都需要一个IAD描述符。
3、 bFirstInterface:功能1 HID键盘的第一个接口描述符是在总的配置描述符中的第几个从0开始数
4、 bNumEndpoints端点数量必须与下面配置的端点数量相同
5、 bEndpointAddress需要注意地址

1.3、HID报告描述符

例如:HID键盘,建议直接复制。

 //USB键盘报告描述符的定义
const u8 KeyboardReportDescriptor[KP_ReportDescriptor_Size]=
{0x05, 0x01,                    // USAGE_PAGE (Generic Desktop) //630x09, 0x06,                    // USAGE (Keyboard)0xa1, 0x01,                    // COLLECTION (Application)0x05, 0x07,                    //   USAGE_PAGE (Keyboard)0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)0x15, 0x00,                    //   LOGICAL_MINIMUM (0)0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)0x75, 0x01,                    //   REPORT_SIZE (1)0x95, 0x08,                    //   REPORT_COUNT (8)0x81, 0x02,                    //   INPUT (Data,Var,Abs)0x95, 0x01,                    //   REPORT_COUNT (1)0x75, 0x08,                    //   REPORT_SIZE (8)0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)0x95, 0x05,                    //   REPORT_COUNT (5)0x75, 0x01,                    //   REPORT_SIZE (1)0x05, 0x08,                    //   USAGE_PAGE (LEDs)0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)0x95, 0x01,                    //   REPORT_COUNT (1)0x75, 0x03,                    //   REPORT_SIZE (3)0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)0x95, 0x06,                    //   REPORT_COUNT (6)0x75, 0x08,                    //   REPORT_SIZE (8)0x15, 0x00,                    //   LOGICAL_MINIMUM (0)0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)0x05, 0x07,                    //   USAGE_PAGE (Keyboard)0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)0x81, 0x00,                    //   INPUT (Data,Ary,Abs)0xc0,                           // END_COLLECTION//0xc0,}; /* KeyboardMouse_ReportDescriptor */

1.4、字符串描述符

说明一下,一般这里不会出错,不做解释。

/* USB String Descriptors (optional) */
const uint8_t Mouse_StringLangID[Mouse_SIZ_STRING_LANGID] ={Mouse_SIZ_STRING_LANGID,USB_STRING_DESCRIPTOR_TYPE,0x09,0x04}; /* LangID = 0x0409: U.S. English */const uint8_t Mouse_StringVendor[Mouse_SIZ_STRING_VENDOR] ={Mouse_SIZ_STRING_VENDOR, /* Size of Vendor string */USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*//* Manufacturer: "STMicroelectronics" */'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,'c', 0, 's', 0};const uint8_t Mouse_StringProduct[Mouse_SIZ_STRING_PRODUCT] ={Mouse_SIZ_STRING_PRODUCT,          /* bLength */USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, '1', 0, '0', 0};
uint8_t Mouse_StringSerial[Mouse_SIZ_STRING_SERIAL] ={Mouse_SIZ_STRING_SERIAL,           /* bLength */USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, '1', 0, '0', 0};

2、STM32 usbprop.c USB应用相关的属性配置

主要包括两个函数的修改,参考此模板进行添加,如下

void Mouse_Reset(void)
{/* Set Mouse_DEVICE as not configured */pInformation->Current_Configuration = 0;pInformation->Current_Interface = 0;/*the default Interface*//* Current Feature initialization */pInformation->Current_Feature = Mouse_ConfigDescriptor[7];SetBTABLE(BTABLE_ADDRESS);/* Initialize Endpoint 0 */SetEPType(ENDP0, EP_CONTROL);SetEPTxStatus(ENDP0, EP_TX_STALL);SetEPRxAddr(ENDP0, ENDP0_RXADDR);SetEPTxAddr(ENDP0, ENDP0_TXADDR);Clear_Status_Out(ENDP0);SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);SetEPRxValid(ENDP0);/* Initialize Endpoint 1 */SetEPType(ENDP1, EP_INTERRUPT);SetEPTxAddr(ENDP1, ENDP1_TXADDR);SetEPTxCount(ENDP1, 4);SetEPRxStatus(ENDP1, EP_RX_DIS);SetEPTxStatus(ENDP1, EP_TX_NAK);/* Initialize Endpoint Out 1 */SetEPRxAddr(ENDP1, ENDP1_RXADDR); //设置接收数据的地址SetEPRxCount(ENDP1, 2);  //设置接收长度SetEPRxStatus(ENDP1, EP_RX_VALID); //设置端点有效,可以接收数据/* Initialize Endpoint In 2 */SetEPType(ENDP2, EP_INTERRUPT); //初始化为中断端点类型SetEPTxAddr(ENDP2, ENDP2_TXADDR); //设置发送数据的地址SetEPTxCount(ENDP2, 5); //设置发送的长度SetEPTxStatus(ENDP2, EP_TX_NAK); //设置端点处于忙状态/* Initialize Endpoint 1 */SetEPType(ENDP7, EP_BULK);SetEPTxAddr(ENDP7, ENDP7_TXADDR);SetEPTxStatus(ENDP7, EP_TX_NAK);SetEPRxStatus(ENDP7, EP_RX_DIS);/* Initialize Endpoint 2 */SetEPType(ENDP5, EP_INTERRUPT);SetEPTxAddr(ENDP5, ENDP5_TXADDR);SetEPRxStatus(ENDP5, EP_RX_DIS);SetEPTxStatus(ENDP5, EP_TX_NAK);/* Initialize Endpoint 3 */SetEPType(ENDP6, EP_BULK);SetEPRxAddr(ENDP6, ENDP6_RXADDR);SetEPRxCount(ENDP6, 64);SetEPRxStatus(ENDP6, EP_RX_VALID);SetEPTxStatus(ENDP6, EP_TX_DIS);bDeviceState = ATTACHED;/* Set this device to response on default address */SetDeviceAddress(0);
}
RESULT Mouse_Data_Setup(uint8_t RequestNo)
{uint8_t *(*CopyRoutine)(uint16_t);CopyRoutine = NULL;if ((RequestNo == GET_DESCRIPTOR)&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))&& (pInformation->USBwIndex0 < 4)){if (pInformation->USBwValue1 == REPORT_DESCRIPTOR){if (pInformation->USBwIndex0 == 0)CopyRoutine = KP_GetReportDescriptor;elseCopyRoutine = Mouse_GetReportDescriptor;}else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE){if (pInformation->USBwIndex0 == 0)CopyRoutine = KP_GetHIDDescriptor;elseCopyRoutine = Mouse_GetHIDDescriptor;}} /* End of GET_DESCRIPTOR *//*** GET_PROTOCOL ***/else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))&& RequestNo == GET_PROTOCOL){CopyRoutine = Mouse_GetProtocolValue;}if (RequestNo == GET_LINE_CODING){if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)){CopyRoutine = Virtual_Com_Port_GetLineCoding;}}else if (RequestNo == SET_LINE_CODING){if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)){CopyRoutine = Virtual_Com_Port_SetLineCoding;}Request = SET_LINE_CODING;}if (CopyRoutine == NULL){return USB_UNSUPPORT;}pInformation->Ctrl_Info.CopyData = CopyRoutine;pInformation->Ctrl_Info.Usb_wOffset = 0;(*CopyRoutine)(0);return USB_SUCCESS;
}

需要注意的点:KP_OFF_HID_DESC必须与配置描述符中HID对应的类描述符的地址相等,可以理解为地址偏移量

ONE_DESCRIPTOR KP_Hid_Descriptor =                                  //{                                                                 //(u8*)Mouse_ConfigDescriptor + KP_OFF_HID_DESC,                   //Mouse_SIZ_HID_DESC                                                //};

3、STM32 usb conf.h USB配置文件

主要做配置端点基地址

#define BTABLE_ADDRESS      (0x00)/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x18)
#define ENDP0_TXADDR        (0x58)/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0x100)
#define ENDP1_RXADDR        (0x110)
/* EP2  */
/* tx buffer base address */
#define ENDP2_TXADDR        (0x120)#define ENDP7_TXADDR        (0x140)
#define ENDP5_TXADDR        (0x180)
#define ENDP6_RXADDR        (0x1C0)

4、STM32 usb istr.c USB中断处理函数

在文件最后添加对应端点的中断处理函数
例如如下代码

u8 EP1BUSY=0;
u8 EP2BUSY=0;
void EP1_IN_Callback(void)
{//  EP1BUSY=0;
}
void EP2_IN_Callback(void)
{//  EP2BUSY=0;
}
void EP1_OUT_Callback(void)
{//  SetEPRxValid(ENDP1);
}

最后看一下效果

接入stm32 USB接口时

资源地址 https://download.csdn.net/download/weixin_44748127/85983409?spm=1001.2014.3001.5501

stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析相关推荐

  1. DM816X 实现 USB HID Gadget 鼠标键盘功能

    DM816X 实现 USB HID Gadget 鼠标键盘功能 开发环境: 平台: DM8168 内核 :linux 2.6.32 RDK:DVRRDK_04.00.00.03 USB口:DM8168 ...

  2. [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备

    序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...

  3. 记录一下 开发STM32 USB HID踩过的坑

    记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...

  4. STM32 USB HID Mouse And Keyboard (guide)

    There is a post (STM32 And Custom USB HID Device? Yes Please!) that gets a lot of attention, althoug ...

  5. STM32 USB HID IAP升级

    找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...

  6. STM32 USB HID设置(STM32CubeMX)

    STM32F070F6P USB HID设置 1.打开STM32CubeMX软件,选择"NEW"新建一个工程 2.选择芯片型号STM32F070F6P 3.在Swap PA9/10 ...

  7. usb gaghet hid 模拟鼠标键盘的绝对值描述

    调试模拟键盘鼠标花了我接近一周的时间,到处查找资料,结果东平西凑.靠上厕所的灵感,终于调通了, 主要注意的是绝对值坐标和相对坐标的表达不一样 最后在这里找到了答案,感谢21ic tanganrong ...

  8. win10 无法识别所有usb设备(鼠标/键盘等)

    又如usb3.0 可扩展主控器无法识别,设备无法启动错误代码10 这个一般是内存引起的,解决办法如下 1.首先用触摸板打开,打开设备管理器 win10右键windows(电脑左下角),左键设备管理器 ...

  9. STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯

    文章目录 目的 基础说明 使用STM32CubeIDE配置生成代码 用户代码分析 回环测试 串口参数设置 USB HS使用与演示 通讯速率测试 测试代码 USB FS测试 USB HS测试 影响速度的 ...

最新文章

  1. Ubuntu18.04中pyhton默认版本从2.7换为3.x
  2. CentOS升级Python2到Python3
  3. MySQL5.7号称永久解决了复制延迟问题的并行复制
  4. Android 4.4 MediaRecorder系统结构
  5. mysql resulttype_Mysql中结果集(mysql_result)与Traversable
  6. 常用的第三方库(OC)
  7. Kali Linux系统设置中文语言环境-1
  8. 【九天教您南方cass 9.1】 08 绘制等高线及对其处理
  9. mysql建三行三列表格_基于另一个表中列的名称在mysql中创建表
  10. 搜索结果去重_华为诺亚方舟实验室推荐与搜索方向六项研究成果获CIKM 2020录用...
  11. java宿舍管理系统代码_JAVA学生宿舍管理系统
  12. Android手机上剪藏笔记到Obsidian
  13. Android 接收和收发短信
  14. javaWeb的线下服装店管理平台、基于ssm(springboot版本也有)+mysql线下服装销售系统
  15. 【SAP Basis】SAP用户账号管理
  16. 并发请求多 服务器响应慢 post,从服务端视角看高并发问题
  17. realme发布最便宜5G手机,心生不忿的小米强调体验不好
  18. 从虚拟走向现实!数字孪生迎来崛起
  19. 在Unity中实现体素化
  20. reg51.h、intrins.h这源文件

热门文章

  1. ElasticSearch.bat 文件闪退 解决
  2. 2019.01.17【BZOJ4399】 魔法少女LJJ(FHQ_treap)(ODT)
  3. 接口调用成功,功能实现但是返回404报错
  4. 会员等级进度功能前端实现
  5. 免单拼团商城小程序开发
  6. Lab5: xv6 lazy page allocation
  7. Python实现PhotoShop人脸液化变形效果
  8. 录制课程用什么软件好?3款超好用的课程视频录课软件
  9. 大数据优化服务 黑科技创造价值 智慧旅游来势猛
  10. 【DSP教程】第35章 FIR有限冲击响应滤波器设计