一、整体步骤
- 使用STM32CubeMX 生成 HID 模版
- 自己定义mouseHID 结构体,然后通过发送鼠标报文控制鼠标的移动
二、STM32CubeMX 配置
芯片:STM32F407VG
- 使用USB的时候,STM32的堆空间需要设置大一点
- 建议:将选择对应的外设生成C文件
三、USB HID报文相关内容
1、鼠标报文
鼠标发送给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 -- 滚轮变化。
2、键盘报文
键盘发送给PC的数据每次8个字节
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8
定义分别是:
BYTE0 --(0 = OFF,1 = ON,CONSTANT为保留位)
|--bit0: NUM LOCK
|--bit1: CAPS LOCK
|--bit2: SCROLL LOCK
|--bit3: COMPOSE
|--bit4: KANA
|--bit5: CONSTANT
|--bit6: CONSTANT
|--bit7: CONSTANT
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 -- 这六个为普通按键
3、对应的鼠标报文结构体以及鼠标报文的使用
/* 鼠标报文结构体 */
struct mouseHID_t {
uint8_t buttons;
int8_t x;
int8_t y;
int8_t wheel;
};
/* 发送鼠标报文(一直发送该报文,鼠标会水平向右移动) */
struct mouseHID_t mouseHID;
mouseHID.buttons = 0;
mouseHID.x = 10;
mouseHID.y = 0;
mouseHID.wheel = 0;
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&mouseHID, sizeof(struct mouseHID_t));