本帖最后由 bigfanofloT 于 2017-5-31 12:27 编辑  
 
严 正 声 明:本文出自机智云开发者社区,转载请注明出处,http://club.gizwits.com/thread-4986-1-1.html 
Copyright@2017 bigfanofloT  
 
视频: 
QQ飞车测试: 
http://player.youku.com/player.php/sid/XMjUyOTY3NDkwOA==/v.swf 
坦克世界测试: 
http://player.youku.com/player.php/sid/XMjUyOTY5NTEyNA==/v.swf 
硬件:带USB控制器的STM32都可以,我这里使用的是Nucleo-L476RG,芯片是STM32L476RG,支持USB2.0全速模式,其中 
PA12---->USB_DP 
 PA11---->USB_DM 
软件:使用STM32CubeMX配置 
直接用USB线连接到电脑USB即可,按照USB规范,USB线里面的绿线为DP(D+),白线为DM(D-),全速设备是要在DP线加上拉1.5K电阻的,由于 
 
USB HID设备数据格式,参考如下: 
对于单个设备: 
鼠标发送给PC的数据每次4个字节 : 
BYTE1 BYTE2 BYTE3 BYTE4  
定义分别是:  
BYTE1 --  
       |--bit7:   1   表示   Y   坐标的变化量超出-256   ~   255的范围,0表示没有溢出  ; 
       |--bit6:   1   表示   X   坐标的变化量超出-256   ~   255的范围,0表示没有溢出;   
       |--bit5:   Y   坐标变化的符号位,1表示负数,即鼠标向下移动  ; 
       |--bit4:   X   坐标变化的符号位,1表示负数,即鼠标向左移动  ; 
       |--bit3:     恒为1  ; 
       |--bit2:     1表示中键按下  ; 
       |--bit1:     1表示右键按下  ; 
       |--bit0:     1表示左键按下  ; 
BYTE2 -- X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量;   
BYTE3 -- Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量 ; 
BYTE4 -- 滚轮变化。  
BYTE1的4-7全为0的时候,BYTE2 BYTE3的正负表示鼠标移动方向 。 
键盘发送给PC的数据每次8个字节 : 
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8  
定义分别是:  
BYTE1 --  
       |--bit0:   Left Control是否按下,按下为1  ; 
       |--bit1:   Left Shift  是否按下,按下为1  ; 
       |--bit2:   Left Alt    是否按下,按下为1  ; 
       |--bit3:   Left GUI    是否按下,按下为1 ;  
       |--bit4:   Right Control是否按下,按下为1 ;   
       |--bit5:   Right Shift 是否按下,按下为1  ; 
       |--bit6:   Right Alt   是否按下,按下为1  ; 
       |--bit7:   Right GUI   是否按下,按下为1  ; 
BYTE2 -- 暂不清楚,有的地方说是保留位 ; 
BYTE3--BYTE8 -- 这六个为普通按键 ; 
 
上个图吧: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 |