DIY键盘教程(一)配置USB HID

首先键盘使用的主控是stm32f401CCU6,开发方式为cubemx+keil。键盘主要采用的是USB HID+矩阵键盘扫描,灯光部分使用的是ws2812。此教程适合有一定stm32基础的人。

##Cubemx配置

  • 首先用cubemx新建一个工程
  • 选择USB_OTG_FS(有的芯片是USB)
  • mode里选择Device_Only

  • 然后Middleware里选择USB_DEVICE
  • Class For FS IP 里选择Human Interface Device Class(HID)
  • 其中VID和PID可以改成任意你喜欢的值,MANUFACTURER_STRING改成任意你喜欢的值
  • 最后生成代码

keil配置

  • 打开usb_hid.c文件
  • 在文件中搜索HID_MOUSE_ReportDesc(ctrl+f)
  • 因为cubemx默认是生成鼠标报告描述符,所以要将其替换为键盘报告描述符
  • 所以将鼠标描述符内容替换成以下键盘报告描述符内容即可
char ReportDescriptor[63] = {
    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)
    0xc0                           // END_COLLECTION
};
  • 然后将所有的HID_MOUSE_ReportDesc改为HID_KEYBOARD_ReportDesc(ctrl+h)

如下图所示:

  • 打开usbd_hid.h文件
  • 找到#define HID_MOUSE_REPORT_DESC_SIZE 74U(ctrl+f)替换为 #define HID_KEYBOARD_REPORT_DESC_SIZE 63U
  • 所有文件中HID_MOUSE_REPORT_DESC_SIZE替换为HID_KEYBOARD_REPORT_DESC_SIZE(ctrl+h)

  • 然后找到红线那一行,0x02改为0x01,注释里说了1为键盘

  • 打开usb_device.h文件添加一行extern USBD_HandleTypeDef hUsbDeviceFS;

  • 在main.c添加头文件**#include “usbd_hid.h”**及以下试验代码
 /* USER CODE BEGIN 2 */
uint8_t report[8]={0};
 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 	HAL_Delay(2000);
	report[2] = 4;
	USBD_HID_SendReport(&hUsbDeviceFS,report,8);
	HAL_Delay(20);
	report[2] = 0;
	USBD_HID_SendReport(&hUsbDeviceFS,report,8);
	HAL_Delay(1000);
   /* USER CODE END WHILE */

   /* USER CODE BEGIN 3 */
 }
  • 编译烧录
  • 打开记事本
  • stm32通过type-c连接至电脑。

  • 两秒钟后不断打印aaaa…则配置成功🥳

##未完待续。。。

使用 Hugo 构建
主题 StackJimmy 设计