如何使用STM32的USB库支持延迟HID的GET

\u60f3\u8bf7\u6559\u4e0bstm32 usb\u7684CDC\u548cHID\u7c7b\u7684\u56fa\u4ef6\u5e93\u53ef\u4ee5\u5728\u5b98\u7f51\u7684\u4ec0\u4e48\u4f4d\u7f6e\u4e0b\u8f7d\uff0c\u6211\u627e\u4e86\u4e00\u5929\u4e5f\u627e\u4e0d\u5230\u3002

\u6211\u6709\uff0c\u53d1\u7ed9\u4f60\uff0c\u628a\u90ae\u7bb1\u7559\u4e0b

USB HID\u62a5\u544a\u53ca\u62a5\u544a\u63cf\u8ff0\u7b26\u7b80\u4ecb\u76f8\u5173\u8ba8\u8bba\uff1a

\u5728USB\u4e2d\uff0cUSB HOST\u662f\u901a\u8fc7\u5404\u79cd\u63cf\u8ff0\u7b26\u6765\u8bc6\u522b\u8bbe\u5907\u7684\uff0c\u6709\u8bbe\u5907\u63cf\u8ff0\u7b26\uff0c
\u914d\u7f6e\u63cf\u8ff0\u7b26\uff0c\u63a5\u53e3\u63cf\u8ff0\u7b26\uff0c\u7aef\u70b9\u63cf\u8ff0\u7b26\uff0c\u5b57\u7b26\u4e32\u63cf\u8ff0\u7b26\uff0c\u62a5\u544a\u63cf\u8ff0\u7b26\u7b49\u7b49\u3002
USB\u62a5\u544a\u63cf\u8ff0\u7b26(Report Descriptor)\u662fHID\u8bbe\u5907\u4e2d\u7684\u4e00\u4e2a\u63cf\u8ff0\u7b26\uff0c\u5b83\u662f\u6bd4\u8f83
\u590d\u6742\u7684\u4e00\u4e2a\u63cf\u8ff0\u7b26\u3002

USB HID\u8bbe\u5907\u662f\u901a\u8fc7\u62a5\u544a\u6765\u7ed9\u4f20\u9001\u6570\u636e\u7684\uff0c\u62a5\u544a\u6709\u8f93\u5165\u62a5\u544a\u548c\u8f93\u51fa\u62a5\u544a\u3002
\u8f93\u5165\u62a5\u544a\u662fUSB\u8bbe\u5907\u53d1\u9001\u7ed9\u4e3b\u673a\u7684\uff0c\u4f8b\u5982USB\u9f20\u6807\u5c06\u9f20\u6807\u79fb\u52a8\u548c\u9f20\u6807\u70b9\u51fb\u7b49
\u4fe1\u606f\u8fd4\u56de\u7ed9\u7535\u8111\uff0c\u952e\u76d8\u5c06\u6309\u952e\u6570\u636e\u6570\u636e\u8fd4\u56de\u7ed9\u7535\u8111\u7b49\uff1b\u8f93\u51fa\u62a5\u544a\u662f\u4e3b\u673a\u53d1\u9001
\u7ed9USB\u8bbe\u5907\u7684\uff0c\u4f8b\u5982\u952e\u76d8\u4e0a\u7684\u6570\u5b57\u952e\u76d8\u9501\u5b9a\u706f\u548c\u5927\u5199\u5b57\u6bcd\u9501\u5b9a\u706f\u7b49\u3002\u62a5\u544a\u662f
\u4e00\u4e2a\u6570\u636e\u5305\uff0c\u91cc\u9762\u5305\u542b\u7684\u662f\u6240\u8981\u4f20\u9001\u7684\u6570\u636e\u3002\u8f93\u5165\u62a5\u544a\u662f\u901a\u8fc7\u4e2d\u65ad\u8f93\u5165\u7aef\u70b9
\u8f93\u5165\u7684\uff0c\u800c\u8f93\u51fa\u62a5\u544a\u6709\u70b9\u533a\u522b\uff0c\u5f53\u6ca1\u6709\u4e2d\u65ad\u8f93\u51fa\u7aef\u70b9\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u63a7\u5236\u8f93\u51fa
\u7aef\u70b90\u53d1\u9001\uff0c\u5f53\u6709\u4e2d\u65ad\u8f93\u51fa\u7aef\u70b9\u65f6\uff0c\u901a\u8fc7\u4e2d\u65ad\u8f93\u51fa\u7aef\u70b9\u53d1\u51fa\u3002

\u800c\u62a5\u544a\u63cf\u8ff0\u7b26\uff0c\u662f\u63cf\u8ff0\u4e00\u4e2a\u62a5\u544a\u4ee5\u53ca\u62a5\u544a\u91cc\u9762\u7684\u6570\u636e\u662f\u7528\u6765\u5e72\u4ec0\u4e48\u7528\u7684\u3002
\u901a\u8fc7\u5b83\uff0cUSB HOST\u53ef\u4ee5\u5206\u6790\u51fa\u62a5\u544a\u91cc\u9762\u7684\u6570\u636e\u6240\u8868\u793a\u7684\u610f\u601d\u3002\u5b83\u901a\u8fc7\u63a7\u5236\u8f93\u5165
\u7aef\u70b90\u8fd4\u56de\uff0c\u4e3b\u673a\u4f7f\u7528\u83b7\u53d6\u62a5\u544a\u63cf\u8ff0\u7b26\u547d\u4ee4\u6765\u83b7\u53d6\u62a5\u544a\u63cf\u8ff0\u7b26\uff0c\u6ce8\u610f\u8fd9\u4e2a\u8bf7\u6c42
\u662f\u53d1\u9001\u5230\u63a5\u53e3\u7684\uff0c\u800c\u4e0d\u662f\u5230\u8bbe\u5907\u3002\u4e00\u4e2a\u62a5\u544a\u63cf\u8ff0\u7b26\u53ef\u4ee5\u63cf\u8ff0\u591a\u4e2a\u62a5\u544a\uff0c\u4e0d\u540c\u7684
\u62a5\u544a\u901a\u8fc7\u62a5\u544aID\u6765\u8bc6\u522b\uff0c\u62a5\u544aID\u5728\u62a5\u544a\u6700\u524d\u9762\uff0c\u5373\u7b2c\u4e00\u4e2a\u5b57\u8282\u3002\u5f53\u62a5\u544a\u63cf\u8ff0\u7b26\u4e2d
\u6ca1\u6709\u89c4\u5b9a\u62a5\u544aID\u65f6\uff0c\u62a5\u544a\u4e2d\u5c31\u6ca1\u6709ID\u5b57\u6bb5\uff0c\u5f00\u59cb\u5c31\u662f\u6570\u636e\u3002\u66f4\u8be6\u7ec6\u7684\u8bf4\u660e\u8bf7\u53c2\u770b
USB HID\u534f\u8bae\uff0c\u8be5\u534f\u8bae\u53ef\u4ece\u4e0b\u8f7d\u3002

USB\u62a5\u544a\u63cf\u8ff0\u7b26\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528HID Descriptor tool\u6765\u751f\u6210\uff0c\u8fd9\u4e2a\u5de5\u5177\u53ef\u4ee5
\u5230\u4e0b\u8f7d\uff0c\u4e3a\u4e86\u65b9\u4fbf\u5927\u5bb6\uff0c\u6211\u987a\u4fbf\u4e0a\u4f20\u4e86\u4e00\u4efd\u3002





\u4e0b\u9762\u901a\u8fc7\u7531HID Descriptor tool\u751f\u6210\u7684USB\u9f20\u6807\u548cUSB\u952e\u76d8\u6765\u8bf4\u660e\u4e00\u4e0b\u62a5\u544a
\u63cf\u8ff0\u7b26\u548c\u62a5\u544a\u3002

code char KeyBoardReportDescriptor[63] = {
//\u8868\u793a\u7528\u9014\u9875\u4e3a\u901a\u7528\u684c\u9762\u8bbe\u5907
0x05, 0x01, // USAGE_PAGE (Generic Desktop)

//\u8868\u793a\u7528\u9014\u4e3a\u952e\u76d8
0x09, 0x06, // USAGE (Keyboard)

//\u8868\u793a\u5e94\u7528\u96c6\u5408\uff0c\u5fc5\u987b\u8981\u4ee5END_COLLECTION\u6765\u7ed3\u675f\u5b83\uff0c\u89c1\u6700\u540e\u7684END_COLLECTION
0xa1, 0x01, // COLLECTION (Application)

//\u8868\u793a\u7528\u9014\u9875\u4e3a\u6309\u952e
0x05, 0x07, // USAGE_PAGE (Keyboard)

//\u7528\u9014\u6700\u5c0f\u503c\uff0c\u8fd9\u91cc\u4e3a\u5de6ctrl\u952e
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
//\u7528\u9014\u6700\u5927\u503c\uff0c\u8fd9\u91cc\u4e3a\u53f3GUI\u952e\uff0c\u5373window\u952e
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
//\u903b\u8f91\u6700\u5c0f\u503c\u4e3a0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//\u903b\u8f91\u6700\u5927\u503c\u4e3a1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
//\u62a5\u544a\u5927\u5c0f\uff08\u5373\u8fd9\u4e2a\u5b57\u6bb5\u7684\u5bbd\u5ea6\uff09\u4e3a1bit\uff0c\u6240\u4ee5\u524d\u9762\u7684\u903b\u8f91\u6700\u5c0f\u503c\u4e3a0\uff0c\u903b\u8f91\u6700\u5927\u503c\u4e3a1
0x75, 0x01, // REPORT_SIZE (1)
//\u62a5\u544a\u7684\u4e2a\u6570\u4e3a8\uff0c\u5373\u603b\u5171\u67098\u4e2abits
0x95, 0x08, // REPORT_COUNT (8)
//\u8f93\u5165\u7528\uff0c\u53d8\u91cf\uff0c\u503c\uff0c\u7edd\u5bf9\u503c\u3002\u50cf\u952e\u76d8\u8fd9\u7c7b\u4e00\u822c\u62a5\u544a\u7edd\u5bf9\u503c\uff0c
//\u800c\u9f20\u6807\u79fb\u52a8\u8fd9\u6837\u7684\u5219\u62a5\u544a\u76f8\u5bf9\u503c\uff0c\u8868\u793a\u9f20\u6807\u79fb\u52a8\u591a\u5c11
0x81, 0x02, // INPUT (Data,Var,Abs)
//\u4e0a\u9762\u8fd9\u8fd9\u51e0\u9879\u63cf\u8ff0\u4e86\u4e00\u4e2a\u8f93\u5165\u7528\u7684\u5b57\u6bb5\uff0c\u603b\u5171\u4e3a8\u4e2abits\uff0c\u6bcf\u4e2abit\u8868\u793a\u4e00\u4e2a\u6309\u952e
//\u5206\u522b\u4ece\u5de6ctrl\u952e\u5230\u53f3GUI\u952e\u3002\u8fd98\u4e2abits\u521a\u597d\u6784\u6210\u4e00\u4e2a\u5b57\u8282\uff0c\u5b83\u4f4d\u4e8e\u62a5\u544a\u7684\u7b2c\u4e00\u4e2a\u5b57\u8282\u3002
//\u5b83\u7684\u6700\u4f4e\u4f4d\uff0c\u5373bit-0\u5bf9\u5e94\u7740\u5de6ctrl\u952e\uff0c\u5982\u679c\u8fd4\u56de\u7684\u6570\u636e\u8be5\u4f4d\u4e3a1\uff0c\u5219\u8868\u793a\u5de6ctrl\u952e\u88ab\u6309\u4e0b\uff0c
//\u5426\u5219\uff0c\u5de6ctrl\u952e\u6ca1\u6709\u6309\u4e0b\u3002\u6700\u9ad8\u4f4d\uff0c\u5373bit-7\u8868\u793a\u53f3GUI\u952e\u7684\u6309\u4e0b\u60c5\u51b5\u3002\u4e2d\u95f4\u7684\u51e0\u4e2a\u4f4d\uff0c
//\u9700\u8981\u6839\u636eHID\u534f\u8bae\u4e2d\u89c4\u5b9a\u7684\u7528\u9014\u9875\u8868\uff08HID Usage Tables\uff09\u6765\u786e\u5b9a\u3002\u8fd9\u91cc\u901a\u5e38\u7528\u6765\u8868\u793a
//\u7279\u6b8a\u952e\uff0c\u4f8b\u5982ctrl\uff0cshift\uff0cdel\u952e\u7b49



//\u8fd9\u6837\u7684\u6570\u636e\u6bb5\u4e2a\u6570\u4e3a1
0x95, 0x01, // REPORT_COUNT (1)
//\u6bcf\u4e2a\u6bb5\u957f\u5ea6\u4e3a8bits
0x75, 0x08, // REPORT_SIZE (8)
//\u8f93\u5165\u7528\uff0c\u5e38\u91cf\uff0c\u503c\uff0c\u7edd\u5bf9\u503c
0x81, 0x03, // INPUT (Cnst,Var,Abs)

//\u4e0a\u9762\u8fd98\u4e2abit\u662f\u5e38\u91cf\uff0c\u8bbe\u5907\u5fc5\u987b\u8fd4\u56de0

//\u8fd9\u6837\u7684\u6570\u636e\u6bb5\u4e2a\u6570\u4e3a5
0x95, 0x05, // REPORT_COUNT (5)
//\u6bcf\u4e2a\u6bb5\u5927\u5c0f\u4e3a1bit
0x75, 0x01, // REPORT_SIZE (1)
//\u7528\u9014\u662fLED\uff0c\u5373\u7528\u6765\u63a7\u5236\u952e\u76d8\u4e0a\u7684LED\u7528\u7684\uff0c\u56e0\u6b64\u4e0b\u9762\u4f1a\u8bf4\u660e\u5b83\u662f\u8f93\u51fa\u7528
0x05, 0x08, // USAGE_PAGE (LEDs)
//\u7528\u9014\u6700\u5c0f\u503c\u662fNum Lock\uff0c\u5373\u6570\u5b57\u952e\u9501\u5b9a\u706f
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
//\u7528\u9014\u6700\u5927\u503c\u662fKana\uff0c\u8fd9\u4e2a\u662f\u4ec0\u4e48\u706f\u6211\u4e5f\u4e0d\u6e05\u695a^_^
0x29, 0x05, // USAGE_MAXIMUM (Kana)
//\u5982\u524d\u9762\u6240\u8bf4\uff0c\u8fd9\u4e2a\u5b57\u6bb5\u662f\u8f93\u51fa\u7528\u7684\uff0c\u7528\u6765\u63a7\u5236LED\u3002\u53d8\u91cf\uff0c\u503c\uff0c\u7edd\u5bf9\u503c\u3002
//1\u8868\u793a\u706f\u4eae\uff0c0\u8868\u793a\u706f\u706d
0x91, 0x02, // OUTPUT (Data,Var,Abs)

//\u8fd9\u6837\u7684\u6570\u636e\u6bb5\u4e2a\u6570\u4e3a1
0x95, 0x01, // REPORT_COUNT (1)
//\u6bcf\u4e2a\u6bb5\u5927\u5c0f\u4e3a3bits
0x75, 0x03, // REPORT_SIZE (3)
//\u8f93\u51fa\u7528\uff0c\u5e38\u91cf\uff0c\u503c\uff0c\u7edd\u5bf9
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
//\u7531\u4e8e\u8981\u6309\u5b57\u8282\u5bf9\u9f50\uff0c\u800c\u524d\u9762\u63a7\u5236LED\u7684\u53ea\u7528\u4e865\u4e2abit\uff0c
//\u6240\u4ee5\u540e\u9762\u9700\u8981\u9644\u52a03\u4e2a\u4e0d\u7528bit\uff0c\u8bbe\u7f6e\u4e3a\u5e38\u91cf\u3002

//\u62a5\u544a\u4e2a\u6570\u4e3a6
0x95, 0x06, // REPORT_COUNT (6)
//\u6bcf\u4e2a\u6bb5\u5927\u5c0f\u4e3a8bits
0x75, 0x08, // REPORT_SIZE (8)
//\u903b\u8f91\u6700\u5c0f\u503c0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//\u903b\u8f91\u6700\u5927\u503c255
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
//\u7528\u9014\u9875\u4e3a\u6309\u952e
0x05, 0x07, // USAGE_PAGE (Keyboard)
//\u4f7f\u7528\u6700\u5c0f\u503c\u4e3a0
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
//\u4f7f\u7528\u6700\u5927\u503c\u4e3a0x65
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
//\u8f93\u5165\u7528\uff0c\u53d8\u91cf\uff0c\u6570\u7ec4\uff0c\u7edd\u5bf9\u503c
0x81, 0x00, // INPUT (Data,Ary,Abs)
//\u4ee5\u4e0a\u5b9a\u4e49\u4e866\u4e2a8bit\u5bbd\u7684\u6570\u7ec4\uff0c\u6bcf\u4e2a8bit\uff08\u5373\u4e00\u4e2a\u5b57\u8282\uff09\u7528\u6765\u8868\u793a\u4e00\u4e2a\u6309\u952e\uff0c\u6240\u4ee5\u53ef\u4ee5\u540c\u65f6
//\u67096\u4e2a\u6309\u952e\u6309\u4e0b\u3002\u6ca1\u6709\u6309\u952e\u6309\u4e0b\u65f6\uff0c\u5168\u90e8\u8fd4\u56de0\u3002\u5982\u679c\u6309\u4e0b\u7684\u952e\u592a\u591a\uff0c\u5bfc\u81f4\u952e\u76d8\u626b\u63cf\u7cfb\u7edf
//\u65e0\u6cd5\u533a\u5206\u6309\u952e\u65f6\uff0c\u5219\u5168\u90e8\u8fd4\u56de0x01\uff0c\u53736\u4e2a0x01\u3002\u5982\u679c\u6709\u4e00\u4e2a\u952e\u6309\u4e0b\uff0c\u5219\u8fd96\u4e2a\u5b57\u8282\u4e2d\u7684\u7b2c\u4e00
//\u4e2a\u5b57\u8282\u4e3a\u76f8\u5e94\u7684\u952e\u503c\uff08\u5177\u4f53\u7684\u503c\u53c2\u770bHID Usage Tables\uff09\uff0c\u5982\u679c\u4e24\u4e2a\u952e\u6309\u4e0b\uff0c\u5219\u7b2c1\u30012\u4e24\u4e2a
//\u5b57\u8282\u5206\u522b\u4e3a\u76f8\u5e94\u7684\u952e\u503c\uff0c\u4ee5\u6b21\u7c7b\u63a8\u3002


//\u5173\u96c6\u5408\uff0c\u8ddf\u4e0a\u9762\u7684\u5bf9\u5e94
0xc0 // END_COLLECTION
};


\u901a\u8fc7\u4e0a\u9762\u7684\u5206\u6790\uff0c\u6211\u4eec\u77e5\u9053\u8fd9\u4e2a\u62a5\u544a\u4e2d\u53ea\u6709\u4e00\u4e2a\u62a5\u544a\uff0c\u6240\u4ee5\u6ca1\u6709\u62a5\u544aID\uff0c
\u56e0\u6b64\u8fd4\u56de\u7684\u90fd\u662f\u5b9e\u9645\u4f7f\u7528\u7684\u6570\u636e\u3002\u603b\u5171\u67098\u5b57\u8282\u8f93\u5165\uff0c1\u5b57\u8282\u8f93\u51fa\u3002\u5176\u4e2d\u8f93\u5165\u7684
\u7b2c\u4e00\u5b57\u8282\u7528\u6765\u8868\u793a\u7279\u6b8a\u6309\u952e\uff0c\u7b2c\u4e8c\u5b57\u8282\u4fdd\u7559\uff0c\u540e\u9762\u7684\u516d\u5b57\u8282\u4e3a\u666e\u901a\u6309\u952e\u3002\u5982\u679c
\u53ea\u6709\u5de6ctrl\u952e\u6309\u4e0b\uff0c\u5219\u8fd4\u56de01 00 00 00 00 00 00 00\uff08\u5341\u516d\u8fdb\u5236\uff09\uff0c\u5982\u679c
\u53ea\u6709\u6570\u5b57\u952e1 \u6309\u4e0b\uff0c\u5219\u8fd4\u56de00 00 59 00 00 00 00 00\uff0c\u5982\u679c\u6570\u5b57
\u952e1 \u548c2 \u540c\u65f6\u6309\u4e0b\uff0c\u5219\u8fd4\u56de00 00 59 5A 00 00 00 00\uff0c\u5982\u679c
\u518d\u6309\u4e0b\u5de6shift \u952e\uff0c\u5219\u8fd4\u56de02 00 59 5A 00 00 00 00\uff0c
\u7136\u540e\u518d\u91ca\u653e1 \u952e\uff0c\u5219\u8fd4\u56de02 00 5A 00 00 00 00 00\uff0c
\u7136\u540e\u5168\u90e8\u6309\u952e\u91ca\u653e\uff0c\u5219\u8fd4\u56de00 00 00 00 00 00 00 00\u3002
\u8fd9\u4e9b\u6570\u636e\uff08\u5373\u62a5\u544a\uff09\u90fd\u662f\u901a\u8fc7\u4e2d\u65ad\u7aef\u70b9\u8fd4\u56de\u7684\u3002\u5f53\u6309\u4e0bNum Lock\u952e\u65f6\uff0cPC\u4f1a\u53d1\u9001
\u8f93\u51fa\u62a5\u544a\uff0c\u4ece\u62a5\u544a\u63cf\u8ff0\u7b26\u4e2d\u6211\u4eec\u77e5\u9053\uff0cNum Lock\u7684LED\u5bf9\u5e94\u7740\u8f93\u51fa\u62a5\u544a\u7684\u6700\u4f4e\u4f4d\uff0c
\u5f53\u6570\u5b57\u5c0f\u952e\u76d8\u6253\u5f00\u65f6\uff0c\u8f93\u51faxxxxxxx1\uff08\u4e8c\u8fdb\u5236\uff0c\u6253x\u7684\u7531\u5176\u5b83\u7684LED\u72b6\u6001\u51b3\u5b9a\uff09\uff1b
\u5f53\u6570\u5b57\u5c0f\u952e\u76d8\u5173\u95ed\u65f6\uff0c\u8f93\u51faxxxxxxx0\uff08\u540c\u524d\uff09\u3002\u53d6\u51fa\u6700\u4f4e\u4f4d\u5c31\u53ef\u4ee5\u63a7\u5236\u6570\u5b57\u952e\u9501\u5b9aLED\u4e86\u3002


\u4e0b\u9762\u8fd9\u4e2a\u62a5\u544a\u63cf\u8ff0\u7b26\u662fUSB\u9f20\u6807\u62a5\u544a\u63cf\u8ff0\u7b26\uff0c\u6bd4\u8d77\u952e\u76d8\u7684\u6765\u8bf4\u8981\u7b80\u5355\u4e9b\u3002
\u5b83\u63cf\u8ff0\u4e864\u4e2a\u5b57\u8282\uff0c\u7b2c\u4e00\u4e2a\u5b57\u8282\u8868\u793a\u6309\u952e\uff0c\u7b2c\u4e8c\u4e2a\u5b57\u8282\u8868\u793ax\u8f74\uff08\u5373\u9f20\u6807\u5de6\u53f3\u79fb\u52a8\uff0c
0\u8868\u793a\u4e0d\u52a8\uff0c\u6b63\u503c\u8868\u793a\u5f80\u53f3\u79fb\uff0c\u8d1f\u503c\u8868\u793a\u5f80\u5de6\u79fb\uff09\uff0c\u7b2c\u4e09\u4e2a\u5b57\u8282\u8868\u793ay\u8f74\uff08\u5373\u9f20\u6807
\u4e0a\u4e0b\u79fb\u52a8\uff0c0\u8868\u793a\u4e0d\u52a8\uff0c\u6b63\u503c\u8868\u793a\u5f80\u4e0b\u79fb\u52a8\uff0c\u8d1f\u503c\u8868\u793a\u5f80\u4e0a\u79fb\u52a8\uff09\uff0c\u7b2c\u56db\u4e2a\u5b57\u8282
\u8868\u793a\u9f20\u6807\u6eda\u8f6e\uff08\u6b63\u503c\u4e3a\u5f80\u4e0a\u6eda\u52a8\uff0c\u8d1f\u503c\u4e3a\u5f80\u4e0b\u6eda\u52a8\uff09\u3002

code char MouseReportDescriptor[52] = {
//\u901a\u7528\u684c\u9762\u8bbe\u5907
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//\u9f20\u6807
0x09, 0x02, // USAGE (Mouse)
//\u96c6\u5408
0xa1, 0x01, // COLLECTION (Application)
//\u6307\u9488\u8bbe\u5907
0x09, 0x01, // USAGE (Pointer)
//\u96c6\u5408
0xa1, 0x00, // COLLECTION (Physical)
//\u6309\u952e
0x05, 0x09, // USAGE_PAGE (Button)
//\u4f7f\u7528\u6700\u5c0f\u503c1
0x19, 0x01, // USAGE_MINIMUM (Button 1)
//\u4f7f\u7528\u6700\u5927\u503c3\u30021\u8868\u793a\u5de6\u952e\uff0c2\u8868\u793a\u53f3\u952e\uff0c3\u8868\u793a\u4e2d\u952e
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
//\u903b\u8f91\u6700\u5c0f\u503c0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//\u903b\u8f91\u6700\u5927\u503c1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
//\u6570\u91cf\u4e3a3
0x95, 0x03, // REPORT_COUNT (3)
//\u5927\u5c0f\u4e3a1bit
0x75, 0x01, // REPORT_SIZE (1)
//\u8f93\u5165\uff0c\u53d8\u91cf\uff0c\u6570\u503c\uff0c\u7edd\u5bf9\u503c
//\u4ee5\u4e0a3\u4e2abit\u5206\u522b\u8868\u793a\u9f20\u6807\u7684\u4e09\u4e2a\u6309\u952e\u60c5\u51b5\uff0c\u6700\u4f4e\u4f4d\uff08bit-0\uff09\u4e3a\u5de6\u952e
//bit-1\u4e3a\u53f3\u952e\uff0cbit-2\u4e3a\u4e2d\u952e\uff0c\u6309\u4e0b\u65f6\u5bf9\u5e94\u7684\u4f4d\u503c\u4e3a1\uff0c\u91ca\u653e\u65f6\u5bf9\u5e94\u7684\u503c\u4e3a0
0x81, 0x02, // INPUT (Data,Var,Abs)
//\u586b\u51455\u4e2abit\uff0c\u8865\u8db3\u4e00\u4e2a\u5b57\u8282
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)

//\u7528\u9014\u9875\u4e3a\u901a\u7528\u684c\u9762
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//\u7528\u9014\u4e3aX
0x09, 0x30, // USAGE (X)
//\u7528\u9014\u4e3aY
0x09, 0x31, // USAGE (Y)
//\u7528\u9014\u4e3a\u6eda\u8f6e
0x09, 0x38, // USAGE (Wheel)
//\u903b\u8f91\u6700\u5c0f\u503c\u4e3a-127
0x15, 0x81, // LOGICAL_MINIMUM (-127)
//\u903b\u8f91\u6700\u5927\u503c\u4e3a+127
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
//\u5927\u5c0f\u4e3a8\u4e2abits
0x75, 0x08, // REPORT_SIZE (8)
//\u6570\u91cf\u4e3a3\u4e2a\uff0c\u5373\u5206\u522b\u4ee3\u8868x,y,\u6eda\u8f6e
0x95, 0x03, // REPORT_COUNT (3)
//\u8f93\u5165\uff0c\u53d8\u91cf\uff0c\u503c\uff0c\u76f8\u5bf9\u503c
0x81, 0x06, // INPUT (Data,Var,Rel)

//\u5173\u96c6\u5408
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
\u901a\u8fc7\u5bf9\u4e0a\u9762\u7684\u62a5\u544a\u5206\u6790\uff0c\u6211\u4eec\u77e5\u9053\u62a5\u544a\u8fd4\u56de4\u4e2a\u5b57\u8282\uff0c\u6ca1\u6709\u62a5\u544aID\u3002\u5982\u679c\u9f20\u6807\u5de6\u952e\u6309\u4e0b\uff0c
\u5219\u8fd4\u56de01 00 00 00\uff08\u5341\u516d\u8fdb\u5236\u503c\uff09\uff0c\u5982\u679c\u53f3\u952e\u6309\u4e0b\uff0c\u5219\u8fd4\u56de02 00 00 00\uff0c\u5982\u679c\u4e2d\u952e\u6309\u4e0b\uff0c
\u5219\u8fd4\u56de04 00 00 00\uff0c\u5982\u679c\u4e09\u4e2a\u952e\u540c\u65f6\u6309\u4e0b\uff0c\u5219\u8fd4\u56de07 00 00 00\u3002\u5982\u679c\u9f20\u6807\u5f80\u53f3\u79fb\u52a8\u5219
\u7b2c\u4e8c\u5b57\u8282\u8fd4\u56de\u6b63\u503c\uff0c\u503c\u8d8a\u5927\u79fb\u52a8\u901f\u5ea6\u8d8a\u5feb\u3002\u5176\u5b83\u7684\u7c7b\u63a8\u3002
\u4f60\u7684\u4e32\u53f7\u6211\u5df2\u7ecf\u8bb0\u4e0b\uff0c\u91c7\u7eb3\u540e\u6211\u4f1a\u5e2e\u4f60\u5236\u4f5c

如果要支持HID的GET_REPORT请求,按照上一篇博客中的说明,只需要在STM32 USB开发库中的CustomHID例子中做如下修改即可:

1)在usb_prop.c的函数CustomHID_Data_Setup()中,GET_PROTOCOL之后增加如下代码:

/*** GET_PROTOCOL ***/
else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
&& RequestNo == GET_PROTOCOL)
{
CopyRoutine = CustomHID_GetProtocolValue;
} /* 以上代码为原有例程中的代码 */
/*** GET_REPORT ***/ /* 以下代码支持GET_REPORT */
else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
&& RequestNo == GET_REPORT)
{
CopyRoutine = CustomHID_GetReport;
}

2)再增加一个函数:

uint8_t *CustomHID_GetReport(uint16_t Length)
{
if (Length == 0)
{
return 10;
}
return &Report_Buffer[pInformation->Ctrl_Info.Usb_wOffset];
}
3)保证在IN Token到来之前,Report_Buffer中包含有效的数据。

  • 璇锋暀涓涓STM32USB
    绛旓細寮鍙戝簱锛STM32F1Cube搴撳拰STM32_USB_Device_Library 鐜板湪鏉ュ垎鏋愬搱USB鍣ㄤ欢搴撲唬鐮侊紝鍏堟潵鐪usbd_core鏂囦欢锛屽叾澶存枃浠跺彧鏈変竴浜涘嚱鏁板0鏄庯紝娌″暐鍙鐨勶紝鍙湁涓鐐癸紝涔嬪墠鍒嗘瀽usbd_conf.c鏂囦欢鏃堕噷闈SB涓柇鍥炶皟鍑芥暟涓皟鐢ㄧ殑搴曞眰鎺ュ彛閮芥槸鍦╱sbd_core.h鏂囦欢涓0鏄庣殑锛屽悓鏍风敱鐢ㄦ埛瀹炵幇鐨勫簳灞傛帴鍙d篃鏄湪璇ユ枃浠朵腑澹版槑鐨...
  • 濡備綍浣跨敤STM32鐨刄SB闈炴帶鍒剁鐐瑰彂閫佸涓暟鎹寘
    绛旓細--- SMT32F103锛屾牴鎹緥绋婥ustom_HID淇敼锛鍒╃敤EP1 浠P_INTERRUPT 鐨勬柟寮 鍙戦佸寘锛屽師鏉ョ殑渚嬬▼姣忔鍙戦2涓瓧鑺傦紝鐜板湪淇敼鍚庡寘鐨勯暱搴︿笉瓒呰繃64瀛楄妭鏃跺彂閫佹槸姝e父鐨勶紝浣嗗綋涓涓寘闀胯秴杩64瀛楄妭鏃跺氨鍙戦佸け璐ワ紝娌℃湁鏁版嵁鍑烘潵锛堢▼搴忔病鏈夋鏈猴級锛岃鏀圭殑鍦版柟閮藉凡缁忎慨鏀逛簡锛屼笉鐭ラ亾鍝釜鍦版柟杩樻病鏈夋敼鍒颁綅锛岃阿璋紒 鐜拌薄...
  • STM32鐨刄SB鎺ュ彛閫氫俊
    绛旓細閫氳鏃朵笂浣嶆満杞欢鍑嗗鐢涓插彛璋冭瘯宸ュ叿锛燂紵鏄殑璇濓紝闇瑕佸皢stm32鐨剈sb璁惧鏋氫妇鎴愯櫄鎷熶覆鍙g被锛圕DC)锛岄渶瑕佸畨瑁呴┍鍔ㄧ▼搴忥紱濡傛灉涓嶆槸锛岄偅涔堝彲浠ュ皢stm32鐨剈sb璁惧鏋氫妇鎴怘ID绫昏嚜瀹氫箟璁惧锛屾槸涓嶉渶瑕侀┍鍔ㄧ殑銆傝皟璇曢渶瑕佺敤usb璋冭瘯宸ュ叿锛屽叿浣撳簲鐢ㄧ殑璇濋渶瑕佸紑鍙戜笂浣嶆満绋嬪簭鏉ユ敹鍙戞暟鎹紙涓嶆槸椹卞姩鍝︼紝涓ょ爜浜嬶級銆傚彟澶栵紝涔熸病鏈変粈涔...
  • 鎯冲疄鐜USB澶嶅悎璁惧,浣跨敤STM32Cube.姹傚姪
    绛旓細USB璁惧鍙互瀹氫箟涓涓鍚堣澶,澶嶅悎璁惧鍒嗕袱绉,涓绉嶆槸涓涓澶囧涓厤缃,杩樻湁涓绉嶆槸涓涓厤缃涓帴鍙,鍦ㄦ湰渚嬩腑閲囩敤涓涓厤缃涓帴鍙g殑鏂瑰紡 棣栧厛淇敼璁惧鎻忚堪绗,鏍囧噯璁惧鎻忚堪绗﹀拰鎶ュ憡鎻忚堪绗﹂兘涓嶉渶瑕佷慨鏀,鍙渶瑕佷慨鏀归厤缃弿杩扮鍗冲彲淇敼鎻忚堪绗︿箣鍚庤鍚屾椂璁板緱淇敼鎻忚堪绗︾殑闀垮害,鐒跺悗淇敼usb_prop鏂囦欢,涓昏鏄袱涓...
  • stm32濡備綍閫氳繃usb涓插彛鍜岀數鑴戠浉杩炰紶杈撴暟鎹
    绛旓細USB杞覆鍙g嚎锛岄厤缃STM32涓插彛璁剧疆锛屼粠鐢佃剳鎵撳紑涓插彛宸ュ叿鍗冲彲
  • 濡備綍淇敼STM32鐨刄SB渚嬬▼涓鸿嚜宸辨墍鐢
    绛旓細鎴戜滑鎷USB鎽囨潌榧犳爣鑼冧緥鏉ヤ慨鏀,鎶婂畠鏀规垚USB閿洏銆傝鑼冧緥鍦ㄧ洰褰昞Manley\EKBoard\EKSTM32F\USBDemo(8M osc)\USBDemo\USBLib\demos\JoyStickMouse涓,灏咼oyStickMouse澶嶅埗涓浠,鏀瑰悕涓篣SBKeyboard,浠ョ敤鏉ヤ慨鏀广 鎻忚堪绗﹀湪鏂囦欢usb_desc.c涓傜涓涓鏀圭殑鏄澶囨弿杩扮銆傝澶囨弿杩扮鐨勭粨鏋勯兘鏍囧噯鐨,闀垮害涔熸槸鍥哄畾鐨勩傝寖渚嬩腑...
  • doublepistm32鐢╱sb鎬庝箞涓嬭浇浠g爜
    绛旓細1銆侀鍏堜笅杞戒唬鐮侊紝涔嬪墠蹇呴』鐢╱sb绾胯繛鎺ュソdoublepistm32涓旂數鑴戜笂瀹夎鏈塁H340椹卞姩銆2銆佸叾娆″畨瑁呭畬姣曞嵆鍙浣跨敤婧愪唬鐮佷负hex鐨勬枃浠剁紪绋嬨3銆佹渶鍚庨夋嫨浠g爜杩涜涓嬭浇銆
  • stm32 usb hid鐢佃矾鎬庝箞鎺
    绛旓細锛屽皢STM32鐨刄SB鏋氫妇涓篐ID璁惧銆2锛STM32浣跨敤3涓鐐癸紝绔偣0鐢ㄤ簬鏋氫妇鐢紝绔偣1鍜2鐢ㄤ簬鏁版嵁鐨勫彂閫佸拰鎺ユ敹銆3锛岀鐐归暱搴︿负64锛屼篃灏辨槸鍗曟鏈澶氬彲浠ヤ紶杈64涓瓧鑺傛暟鎹4锛孲TM32鑾峰彇涓婁綅鏈轰笅鍙戠殑鏁版嵁骞跺皢璇ユ暟鎹氳繃USB鍘熸牱杩斿洖锛屽悓鏃跺皢鏁版嵁鎵撳嵃杈撳嚭銆5锛屼笂浣嶆満绋嬪簭閫氳繃璋冪敤windows鐨凙PI瀹炵幇瀵笻ID璁惧鐨勮鍐...
  • stm32usb铏氭嫙涓插彛鎬庝箞瀹炵幇
    绛旓細PC閫氳繃铏氭嫙涓插彛鍙戦佹暟鎹埌STM32usb鍙o紝STM32鍐嶉氳繃usart1鍙戦佹暟鎹埌PC涓插彛銆傛垜浠仛椤圭洰鏃讹紝鍙敤USB铏氭嫙涓插彛鍗冲彲銆傛墍浠ユ垜浠幇鍦ㄩ渶瑕佹妸涓插彛鍙戦侀儴鍒嗗垹闄ゃ傛妸USB鍋氫负涓涓狢OM鍙f潵浣跨敤銆傛垜浠濡備綍浣跨敤杩欎釜USB鍙e憿锛焏emo涓槸鎶奤SB鍙戦佹暟鎹仛浜嗕竴涓紦
  • 鍒╃敤stm32璁捐鑳借鍐橴鐩樹腑鏁版嵁鐨勬帶鍒剁數璺 杩欎釜瀹规槗鍋氬悧
    绛旓細瀵规暟鎹紶杈撻熷害瑕佹眰涓嶉珮鐨勮瘽鏄緢绠鍗曠殑 鐢⊿TM32F2XX绯诲垪鐨鍗曠墖鏈锛岃鍗曠墖鏈哄唴缃湁鍏ㄩ烵TG鎺ュ彛锛岄熷害澶ф鑳藉埌1M瀛楄妭/S宸﹀彸,杩欎釜澶栭儴鎺ョ嚎寰堢畝鍗曞氨 鐢垫簮 鍦扮嚎 D+ D- DEC銆傚鏋滈渶瑕佸仛鍒伴珮閫熶紶杈撶殑璇 闇瑕佺敤ULIP 鍘诲鎺HY鏉ュ仛.
  • 扩展阅读:stm32与摄像头接线图 ... stm32usb hid ... stm32编程使用什么软件 ... 怎么用usb线给stm32烧程序 ... 电脑检测不到stm32串口 ... stm32编程入门图解 ... stm32通过usb下载程序 ... stm32f103c8t6usb口使用 ... stm32摄像头无线传输 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网