Skip to content

USB 申明HID设备,实现键盘的功能

1. 硬件连接

软件版本: stm32cubmx:6.2 keil 5

硬件:

  1. stm32F103C8T6最小系统板
  2. 下载器
  3. USB线 alt text

从bilibili 工房子购买开发版 https://gf.bilibili.com/item/detail/1106139112alt text

HID8个数组各自的功能 alt textalt text

2. CubeMX生成代码

配置信息的时候,主要配置了

  1. 外部时钟,
  2. debug口,
  3. USB接口 时钟部分的配置 alt text 使能USB的功能模块 alt text 配置USB的功能为HID设备,也就是键盘设备 alt text

需要注意,在使用USB设备的时候,一定要使用外部的高速时钟, alt text

3. 编写代码

添加申明信息

这部分第一个是因为要调用“usbd_hid”中的函数所以引用 另外也需要使用到usb是这个数据

C
/* USER CODE BEGIN Includes */
# include "usbd_hid.h"

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE END Includes */

main 函数编写

这里调用函数:USBD_HID_SendReport,发送数据给电脑。 需要注意的是,如果按键松开了,则需要将按键松开的信息发送过去。否则的话会默认按键一直按下。从而产生多余的信息。

C

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
    uint8_t HID_Buffer[8] = {0};
    uint8_t HID_Buffer_clean[8] = {0};
  while (1)
  {
      HID_Buffer[2] = 0x04;
      HID_Buffer[3] = 0x05;
      HID_Buffer[4] = 0x06;
      HID_Buffer[5] = 0x1C;
      HID_Buffer[7] = 0x1D;
      USBD_HID_SendReport(&hUsbDeviceFS, HID_Buffer, sizeof(HID_Buffer));
      HAL_Delay(20);
      USBD_HID_SendReport(&hUsbDeviceFS, HID_Buffer_clean, sizeof(HID_Buffer_clean));
      HAL_Delay(1000);
  }
}

HID 修改

  1. 修改报文描述符 下载 HID Descriptor Tool (DT) HID描述符工具: 官网下载:https://usb.org/sites/default/files/documents/dt2_4.zip 百度网盘:https://pan.baidu.com/s/1ayjdQtc7e9NWwYJqdp0pXA?pwd=4ghb 提取码:4ghb

需要注意的是因为默认的报告描述符是鼠标的,所以需要将这个改为键盘的报告描述符

C
/*修改usbd_hid.c中的报告设备描述符*/
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
	0x05, 0x01, // USAGE_PAGE (Generic Desktop) //63
	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)
	0xc0,       // END_COLLECTION
};

2 修改 “usbd_hid.h” 中的申明文件 #include “usbd_hid.h” 文件中的申明文件,修改一下。

C
#define HID_MOUSE_REPORT_DESC_SIZE    63U

4. 后记

看的开心