. c2 G5 x: p! o+ f4 X. T" ]# L. u- K1 W. R
" S. p( y. X% _7 G- h- ]4 \stm32cubemx越来越方便了,之前用nucleo-f767做个了usb复合设备,键盘、鼠标、游戏摇杆的复合体https://www.stmcu.org.cn/module/forum/thread-610675-1-1.html,可以模拟多个设备,这样做个usb键盘就可以全键无冲了,usb协议设计之初坑爹了 一把,导致一般的usb键盘无法做到全键无冲。
# s+ T; O& s" C: Y
" n3 Z' \% f* c6 N* _' H别问我为什么要同时按那么多按键 ' U# ]% v9 Y& W
' G+ p* q( T6 n b- knucleo的st-link关键时刻很给力,手头一时没有其他的仿真器。8 s4 G& D! s$ @. F4 E* ~- }" j
: r5 c# |# q6 _* e) ~3 Q% Z! k
- L5 r @& {) c8 n8 O; S% u9 N8 r6 V$ p0 r! R2 n5 M! g( _
4 |, s# U! G$ u# q0 x这个家伙可不便宜,那个邮票空的是92大洋的mpu9250模块,模块集成了姿态解算,彻底解决了Yaw漂移问题,通过串口输出,arduino也可方便的连接了。4 ^' [ z! n8 P9 F% v
( H0 ^! \: b* c/ U$ \+ W' ?. Z6 ~7 {配置就很简单了,把usb配成hid设备。自己在usbd_custom_hid_if.c加个报告描述符,告诉电脑你是啥。8 A9 e# \2 b+ i4 o, G5 S' ^
! R* r' n1 M9 ~* f' A4 z% j
上个usb键盘的报告:
# N, X1 S* g! S% l% S& N- 0x05, 0x01, // USAGE_PAGE (Generic Desktop)5 e* ~" |, J T& [1 o
- 0x09, 0x06, // USAGE (Keyboard). U: u) f) ^% K8 X, E) s
- 0xa1, 0x01, // COLLECTION (Application)- C7 j6 O# a# K6 D+ o" ]; B" D9 X$ ]
- 0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)% s. S6 E o6 {/ x6 A
- 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)4 J m" f' d2 U) D( p! L
- 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
% W+ R9 w3 W4 {9 S! | A/ U - 0x15, 0x00, // LOGICAL_MINIMUM (0)
5 V2 f/ x; E% ?4 Z# j: R - 0x25, 0x01, // LOGICAL_MAXIMUM (1)3 P! l, i, r- ]. i) U2 u3 L, F
- 0x95, 0x08, // REPORT_COUNT (8)- I. [! g9 e: ?1 U( s' d
- 0x75, 0x01, // REPORT_SIZE (1)/ V* X* u0 y% h o+ a1 Y3 q& x
- 0x81, 0x02, // INPUT (Data,Var,Abs)& n& h1 ~" L7 y4 \' A7 u
- 0x95, 0x01, // REPORT_COUNT (1)2 j9 X2 p0 r7 ^0 ?. p: K' g
- 0x75, 0x08, // REPORT_SIZE (8)0 Q7 `0 _( b* Q+ W% @& r0 P0 ^
- 0x81, 0x03, // INPUT (Cnst,Var,Abs)
: _4 W# A' i9 Z; ]4 n5 I - 0x95, 0x06, // REPORT_COUNT (6)
; ?+ s5 P% g$ V7 k% w" v - 0x75, 0x08, // REPORT_SIZE (8)# Y7 t; b" w6 w& b( S; U8 G. a
- 0x25, 0xFF, // LOGICAL_MAXIMUM (255)3 V8 k5 \; s6 t% @* ^
- 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))# S& y+ ]% f/ `6 x+ D
- 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application); H# M7 t, j& y- U |- ]. k
- 0x81, 0x00, // INPUT (Data,Ary,Abs)) a: ]6 [* _: u% e8 X
- 0x25, 0x01, // LOGICAL_MAXIMUM (1)1 `7 x1 _1 J1 I2 o9 }# Q
- 0x95, 0x02, // REPORT_COUNT (2)* j$ H& `$ K0 B" y% q
- 0x75, 0x01, // REPORT_SIZE (1)! A. B- K$ c- \2 s5 V( @
- 0x05, 0x08, // USAGE_PAGE (LEDs). W, i# g! t% Z) g& N. J* [
- 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
7 t; H! R( v1 F* x7 Z - 0x29, 0x02, // USAGE_MAXIMUM (Caps Lock)
4 L2 ?; @% U4 ^ w0 _5 W - 0x91, 0x02, // OUTPUT (Data,Var,Abs)
# j( V. J: x! z - 0x95, 0x01, // REPORT_COUNT (1). T9 ]4 F5 W5 T
- 0x75, 0x06, // REPORT_SIZE (6). D r- c% H% {4 C
- 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
复制代码 ) U9 x O9 j5 ^1 _4 @; E+ {
' z4 @6 p9 d& G
直接拷贝到CUSTOM_HID_ReportDesc_FS里面的/* USER CODE BEGIN 0 */ 和 /* USER CODE END 0 */ 之间就可以用了。) c/ t, V$ {) ]; y. A& B
4 }( p4 d2 k4 C* W9 d; W: Q
j- A1 j3 B6 b$ e- S
" u( A9 s5 e5 Y* h* ~' ?- a
R- k' m+ P. D7 Z2 V) A |