STM32自定义键盘(二):利用STM32单片机实现USB接口HID键盘

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手动之后将缓存区清空。

      //每秒输入一个小写字母‘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”是键盘键值




    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32自定义键盘(二):利用STM32单片机实现USB接口HID键盘

    发表评论