STM32自定义键盘(二)STM32单片机的USB接口-HID键盘

news/2024/6/1 21:31:17 标签: 单片机, stm32, 嵌入式硬件

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”是键盘键值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/176347.html

相关文章

【阶乘约数】

题目概述: 解题分析: 自己理解: 本来一直不太能理解是怎么操作的,昨天晚上看了一些其他博主的介绍,此时才明白,现在将自己的理解写出来,如果有不对的地方,还请大家指出 就是一个数…

手把手教小伙伴们使用 Nginx 部署 TienChin 项目!

今天我就来手把手教小伙伴们部署 TienChin 项目,一起把这个项目跑起来,看看到底是个什么样的项目。 小伙伴们知道,对于这种前后端分离的项目,我们在实际部署的时候,可以按照前后端分离的方式来部署,也可以…

从零打造属于自己的CI/CD Jenkins+Apifox (一)

安装 1、安装Node.js,Apifox CLI 依赖于 Node.js > v10 yum install -y nodejs 2、安装npm yum install -y npm 3、安装Apifox CLI npm install -g apifox-cli 4、添加环境变量 [rootcommon-jenkins profile.d]# cd /etc/profile.d [rootcommon-jenkins …

实现定时器(主要是代码)

hello,今天为大家带来定时器 的实现 定时器是多线程中让线程更加高效的执行的手段,,就是时间到了,让该任务执行,在Java标准库中有自己的实现,Timer类,它的核心方法是schedule,下面来看看它的具体代码 1. import java.util.TimerTask;//定时器import java.util.Timer;public …

Mysql 窗口函数

一, MySQl 8.0 窗口函数 窗口函数适用场景: 对分组统计结果中的每一条记录进行计算的场景下, 使用窗口函数更好, 注意, 是每一条!! 因为MySQL的普通聚合函数的结果(如 group by)是每一组只有一条记录!!! 可以跟Hive的对比着看: 点我, 特么的花了一晚上整理, 没想到跟Hive 的基本…

Windows环境编译Qt可用的WebRTC库

编译WebRTC静态库参考链接:https://blog.csdn.net/aggs1990/article/details/118230538在cmd中设置临时环境变量set PATH%PATH%;D:\Soft\webrtc\depot_toolsset vs2019_installD:\SetUp\Microsoft Visual Studio\2019\Communityset GYP_MSVS_OVERRIDE_PATHD:\SetUp\…

shopee根据ID取商品详情 API

​简单演示 公共参数​:​​https://o0b.cn/iinoah​​ 名称 类型 必须 描述 key String 是 调用key(前往获取key和secret) secret String 是 调用密钥 api_name String 是 API接口名称(包括在请求地址中&#xf…

Python应用开发——爬取网页图片

Python应用开发——爬取网页图片 目录Python应用开发——爬取网页图片前言1 爬取原理讲解1.1 查看网页源代码1.2 分析网页源码并制定对应的爬取方案1.3 完善爬取流程和细节2 实战演练2.1 PyCharm下载安装2.2 安装相应依赖包(类库)2.3 编写代码2.4 补充细节和优化2.5 运行测试结…