STM32自定义键盘(二)STM32单片机的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手动之后将缓存区清空。

  //每秒输入一个小写字母‘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”是键盘键值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰州_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值