目录

一、整体步骤

二、USB 鼠标HID更改成键盘HID步骤

1、使用STM32CubeMX生成鼠标HID模版,并且进行修改

2、修改HID的接口描述符与报文描述符

3、修改USBD_HID_Setup函数

4、添加以及修改键盘报文描述符(注意!)

三、调试过程中的一些总结

四、HID 报文相关资料


一、整体步骤

  • 使用STM32CubeMX生成 鼠标HID模版,并进行修改
  • 修改HID 接口描述符,以及报文描述符
  • 修改USBD_HID_Setup 函数
  • 添加并且修改键盘报文描述符报文

二、USB 鼠标HID更改成键盘HID步骤

1、使用STM32CubeMX生成鼠标HID模版,并且进行修改

鼠标HID相关内容可以查看:STM32-USB学习系列(四):USB-HID模拟鼠标功能

2、修改HID的接口描述符与报文描述符

  • 注意:端点描述符不做修改!即 HID_EPIN_SIZE 还是0x04 (对应4字节大小,后面在发送键盘报文的时候,需要将键盘的报文大小修改为 4个字节的数组或者结构体)

3、修改USBD_HID_Setup函数

  • 在HID Setup的过程中会获取对应键盘报文描述符

4、添加以及修改键盘报文描述符(注意!)

  • 修改部分为最后面 按键输入描述部分,将后面6个按键缩减为2个按键(即:从6个字节缩减到2个字节),配合上前面2个字节的输入报告,正好是4个字节,刚好符合原来HID端点描述符一次最多发送的大小
__ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[HID_KEYBOARD_REPORT_DESC_SIZE]  __ALIGN_END =
{
0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
0x09, 0x06,                    // USAGE (Keyboard)         /* 用途为键盘 */
0xa1, 0x01,                    // COLLECTION (Application) /* 表示应用结合,必须以END_COLLECTION来结束 */
0x05, 0x07,                    //   USAGE_PAGE (Keyboard)  /* 用途页为按键 */
0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)  /* 用途最小值 左Ctrl */
0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)    /* 用途最大值 右GUI */
0x15, 0x00,                    //   LOGICAL_MINIMUM (0)    /* 逻辑最小值 0 */
0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)    /* 逻辑最大值 1 */
0x75, 0x01,                    //   REPORT_SIZE (1)      /* 报告位大小(这个字段的宽度为1bit) */
0x95, 0x08,                    //   REPORT_COUNT (8)     /* 输入报告第一个字节(报告位大小 8bit) */
0x81, 0x02,                    //   INPUT (Data,Var,Abs) /* 报告为输入用 , 从左ctrl到右GUI 8bit刚好构成1个字节*/0x95, 0x01,                    //   REPORT_COUNT (1)  /* 报告位数量  1个 */
0x75, 0x08,                    //   REPORT_SIZE (8)      /* 输入报告的第二给字节(报告位大小 8bit) */
0x81, 0x03,                    //   INPUT (Cnst,Var,Abs) /* 输入用的保留位,设备必须返回0 */0x95, 0x05,                    //   REPORT_COUNT (5)     /* 报告位数量 5个 */
0x75, 0x01,                    //   REPORT_SIZE (1)      /* 报告位大小,1bit */
0x05, 0x08,                    //   USAGE_PAGE (LEDs)    /* 用途为LED */
0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock) /* 用途最小值 NUM Lock LED灯 */
0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)  /* 用途最大值 Kana 灯 */
0x91, 0x02,                    //   OUTPUT (Data,Var,Abs) /* 输出用途,用于控制LED等 */0x95, 0x01,                    //   REPORT_COUNT (1)     /* 报告位数量 1个 */
0x75, 0x03,                    //   REPORT_SIZE (3)      /* 报告位大小 3bit */
0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)/* 用于字节补齐,跟前面5个bit进行补齐 */0x95, 0x02,//0x06,                    //   REPORT_COUNT (6)  /* 报告位数量 6个*/
0x75, 0x08,                     //   REPORT_SIZE (8)         /* 报告位大小 8bit */
0x15, 0x00,                    //   LOGICAL_MINIMUM (0)      /* 逻辑最小值0 */
0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)    /* 逻辑最大值255 */
0x05, 0x07,                    //   USAGE_PAGE (Keyboard)    /* 用途页为按键 */
0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated)) /* 使用值最小为0 */
0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)          /* 使用值最大为65 */
0x81, 0x00,                    //   INPUT (Data,Ary,Abs)     /* 输入用,变量,数组,绝对值 */
0xc0                                                         /* END_COLLECTION */
};

三、调试过程中的一些总结

  1. 网上有挺多关于STM32 键盘HID的实现,但无一外乎对应的将端点描述符的端点大小设置成0x08(即:发送一次报文的大小为8个字节),同时键盘发送的报文大小都是设置为8个字节,一开始我也是参照网上设置,将端点描述符大小和键盘发送的报文为8个字节,但是出现了发送完报文但是PC端没有反应的情况

  2. 后来我将端点描述符大小 HID_EPIN_SIZE 更改回0x04后,发送8字节的键盘报文,在PC上有对应的键盘输入了。但是出现了新的问题:发送一次过后,再发送空值,键盘也还是无法弹起(即:输入一个a,就一直在输入a,没有办法停止)。

  3. 最后,查询一番资料,我将 键盘报文描述符 中的内容修改,并且将键盘报文从原来8个字节改成4个字节后,就可以正常的发送和弹起了。

四、HID 报文相关资料

HID 报文pdf:链接:https://pan.baidu.com/s/1J7cupCmUc-ogXBkyE6dHiQ 提取码:d8xb 

STM32-USB学习系列(六):USB-HID键盘的实现以及键盘报文描述符的简介相关推荐

  1. 嵌入式USB开发系列(1):USB简介

    嵌入式USB开发系列(1):USB简介 文章目录 嵌入式USB开发系列(1):USB简介 1. USB的优势 2. USB协议标准 3. USB通信接口 声明 声明:USB资料网站 链接,相关协议和文 ...

  2. 从零开始学USB(十九、USB接口HID类设备(一)_HID描述符)

    USB设备中有一大类就是HID设备,即Human Interface Devices,人机接口设备.这类设备包括鼠标.键盘等,主要用于人与计算机进行交互.它是USB协议最早支持的一种设备类.HID设备 ...

  3. Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  4. DIY蓝牙键盘(2) - 理解HID报文描述符

    1. 前情回顾 上篇主要讲了键盘报文的分类与格式,并留下了一个问题:那主机为什么知道我这些报文的格式?那肯定是主机要提前知道我们发的报文的格式,那么问题就变成了:在发送报文前我们要怎么通知主机,让它知 ...

  5. USB学习6---Linux Android USB软件架构设计

    下面学习针对高通平台的HS-USB(HS:high speed高速)堆栈(stack)软件架构设计和源代码布局的细节. Android HS-USB堆栈基于下面几点: Gadget driver fr ...

  6. USB入门系列之四 —— USB的线缆以及插头、插座

    USB是一个标准的协议,因此对线缆.插头.插座等有严格的规范要求.     在最初的标准里,USB接头有4条线:电源,D-,D+,地线.我们暂且把这样的 叫做标准的USB接头吧.后来OTG出现了,又增 ...

  7. USB学习之二 USB PHY

    USB PHY负责最底层的信号转换,作用类似于网口的PHY. 有两种接口,一种是ULPI,一种是UTMI. 前者PIN少,后者PIN多,所以如果用ULPI,PHY一般外部另接: 用UTMI,PIN多, ...

  8. 【Python学习系列六】Python语言基本语法

    1. Python语言简介 Python是一种面向对象的解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, ...

  9. 吕鑫MFC学习系列六

    这一章学习的相关知识框架: 一.根据主窗口类型,MFC软件工程可以分为以下几种架构模型: 1.SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档 ...

最新文章

  1. Java CSV文件读取、写入及追加
  2. 更换主版之后远程管理卡恢复操作
  3. python类与继承person类_关于python中类的继承及self
  4. Android 自定义对话框
  5. ASP.NET MVC 入门4、Controller与Action
  6. Settings【学习笔记05】
  7. 性能测试调优篇---未完待续
  8. 专访iQOO Pro产品经理:以更好的产品 更低的价格推进5G生态普及
  9. 蓝牙网关走进智慧校园
  10. 一个应用范德蒙行列式的例子
  11. 微信公众号排版 | 汇总和实战
  12. (坦克警戒大战)技术服务支持
  13. 2021年2月3日 星期三 农历立春 霾 天津
  14. windows服务器重置密码,如何重置Windows Server 2012管理员密码
  15. linux内核时区文件编辑器——ZIC时区编辑
  16. Ajax案例之聊天机器人
  17. 使用宏基因组的方法快速鉴定新冠病毒SARS-CoV2
  18. 华为智能音响2代鸿蒙,99999元!华为全屋智能方案来了:鸿蒙生态是亮点
  19. zcmu1684 求余数
  20. 【AtCoder】AtCoder Grand Contest 045

热门文章

  1. 按ASC码对字符串排序
  2. 2021年中国城市财力半年报 Top 30
  3. week05-继承、多态、抽象类与接口
  4. java网易云信怎么用_网易云信Web IM入门(二)
  5. 推荐算法工程师面试准备
  6. The JSON value could not be converted to System.Int64
  7. 老婆:“给我讲讲你们程序员好笑的事情呗?”我扔给她这篇文章,她狂笑不止!
  8. matlab直流输电,基于MATLAB/Simulink的高压直流输电系统的仿真研究
  9. 国家开放大学本科计算机基础机考2020,(2021更新)最新国家开放大学电大本科《计算机应用基础》网络课网考形考作业一及二试题答案.docx...
  10. go: cannot determine module path for source directory D:\go\code\SipSvrProxy\src\Common (outside GOP