STM32自定义键盘(二)STM32单片机的USB接口-HID键盘
- HID描述符
- 生成HID键盘工程模板
- 修改HID报告描述符
- 键值数据发送
- USB HID 键盘键值表
HID描述符
请参考这位博主的文章: USB 协议分析之 HID 设备
生成HID键盘工程模板
在stm32cubemx中配置参数如下图:
修改HID报告描述符
修改文件“usbd_custom_hid_if.c”中字符串“CUSTOM_HID_ReportDesc_FS”为以下内容:
/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 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)
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
};
每个字节含义详见这位博主的文章: USB 协议分析之 HID 设备
键值数据发送
一帧数据发送8个字节,第一个字节为shift,ctrl等控制键,第二个字节保留,第三至第八个字节为按键。
byte[0]:
bit0:Left CTRL
bit2: Left ALT
bit3: Left GUI
bit4: Right CTRL
bit5: Right SHIFT
bit6: Right ALT
bit7: Right GUI
byte[1]:0x00
byte[2]:Key 1
byte[3]:Key 2
byte[4]:Key 3
byte[5]:Key 4
byte[6]:Key 5
byte[7]:Key 6
发送函数:
//USBD_HandleTypeDef hUsbDeviceFS;定义在文件"usb_device.c"里面。
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,buf,8);
该发送函数是将键值写入单片机内部的缓存区,并不是直接发送到USB上位机。每隔一段时间上位机(电脑)自动来读取键值,所以需要写入15ms手动之后将缓存区清空。文章来源:https://uudwc.com/A/8e5v
//每秒输入一个小写字母‘a’和一个回车换行
while (1)
{
buf_tmp[0] = 0x00;
buf_tmp[1] = 0x00;
buf_tmp[2] = 0x04;
buf_tmp[3] = 0x58;
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,buf_tmp,8);
HAL_Delay(15);
buf_tmp[0] = 0x00;
buf_tmp[1] = 0x00;
buf_tmp[2] = 0x00;
buf_tmp[3] = 0x00;
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,buf_tmp,8);
HAL_Delay(1000);
}
USB HID 键盘键值表
第三列“HID usage ID”是键盘键值文章来源地址https://uudwc.com/A/8e5v