STM32 基础系列教程 24 - USB_HID_key

2023-10-27

前言

学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开发了。需要提示的是,stm32在使用usb接口功能是一般需要在DP引脚上上拉一个1.5K电阻到3.3V(部分MCU内部会上拉)。

 

示例详解

基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。

 

 

本示例所用的最小系统板原理图:

 

    1. 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:

 

 

      1. 系统时钟树

      1. USB接口配置

      1. USB设备配置(选择Human Interface Device Class(HID),参数可保持默认)

      1. 引脚配置

 

      1. 中断配置(保持默认)

    1. 工程代码
      1. 在usbd_hid.h中做如下更改:

在usbd_hid.c中做如下更改:

/* USB HID device Configuration Descriptor */

__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ]  __ALIGN_END =

{

 

#if 0

  0x09, /* bLength: Configuration Descriptor size */

  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */

  USB_HID_CONFIG_DESC_SIZ,

  /* wTotalLength: Bytes returned */

  0x00,

  0x01,         /*bNumInterfaces: 1 interface*/

  0x01,         /*bConfigurationValue: Configuration value*/

  0x00,         /*iConfiguration: Index of string descriptor describing

  the configuration*/

  0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */

  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/

 

  /************** Descriptor of Joystick Mouse interface ****************/

  /* 09 */

  0x09,         /*bLength: Interface Descriptor size*/

  USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/

  0x00,         /*bInterfaceNumber: Number of Interface*/

  0x00,         /*bAlternateSetting: Alternate setting*/

  0x01,         /*bNumEndpoints*/

  0x03,         /*bInterfaceClass: HID*/

  0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/

  0x02,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/

  0,            /*iInterface: Index of string descriptor*/

  /******************** Descriptor of Joystick Mouse HID ********************/

  /* 18 */

  0x09,         /*bLength: HID Descriptor size*/

  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/

  0x11,         /*bcdHID: HID Class Spec release number*/

  0x01,

  0x00,         /*bCountryCode: Hardware target country*/

  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/

  0x22,         /*bDescriptorType*/

  HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/

  0x00,

  /******************** Descriptor of Mouse endpoint ********************/

  /* 27 */

  0x07,          /*bLength: Endpoint Descriptor size*/

  USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/

 

  HID_EPIN_ADDR,     /*bEndpointAddress: Endpoint Address (IN)*/

  0x03,          /*bmAttributes: Interrupt endpoint*/

  HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */

  0x00,

  HID_FS_BINTERVAL,          /*bInterval: Polling Interval (10 ms)*/

  /* 34 */

      

#else

       /************** Descriptor of Configuation ****************/

  0x09, /* bLength: Configuation Descriptor size */

  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */

  USB_HID_CONFIG_DESC_SIZ,

  /* wTotalLength: Bytes returned */

  0x00,

  0x01,         /* bNumInterfaces: 1 interface */

  0x01,         /* bConfigurationValue: Configuration value */

  0x00,         /* iConfiguration: Index of string descriptor describing the configuration*/

  0xe0,         /* bmAttributes: Bus powered */ //160911

  /*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */

  0xFA,         /* MaxPower 500 mA: this current is used for detecting Vbus */          //160911 以2mA为单位

//            0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */

//    0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus */

 

  /************** Descriptor of Custom HID interface ****************/

  /* 09 */

  0x09,         /* bLength: Interface Descriptor size */

  USB_DESC_TYPE_INTERFACE,/* bDescriptorType: Interface descriptor type = 4*/

  0x00,         /* bInterfaceNumber: Number of Interface */

  0x00,         /* bAlternateSetting: Alternate setting */

  0x02,         /* bNumEndpoints */

  0x03,         /* bInterfaceClass: HID */

  0x01,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */

  0x01,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */

  0,            /* iInterface: Index of string descriptor */

 

  /******************** Descriptor of Custom HID ********************/

  /* 18 */

  0x09,         /* bLength: HID Descriptor size */

  HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */

  0x10,0x01,            /* bcdHID: HID Class Spec release number */ //160911 设备版本号BCD码

  0x00,         /* bCountryCode: Hardware target country */

  0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */

  0x22,         /* bDescriptorType */

  CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */

  0x00,

 

  /******************** Descriptor of Custom HID endpoints ******************/

  /* 27 */

  0x07,                   /* bLength: Endpoint Descriptor size */

  USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: = 5*/

  0x82,            /* bEndpointAddress: (IN) = 2*/

  // bit 3...0 : the endpoint number

  // bit 6...4 : reserved

  // bit 7     : 0(OUT), 1(IN)

  0x03,                   /* bmAttributes: Interrupt endpoint */ //160911 0-1bit定义了传输类型,00=控制,01=同步,10=批量,11=中断事务

  //160911 00=Control, 01=Isochronous, 10=Bulk, 11=Interrupt Transaction

  0x08,                   /* wMaxPacketSize: 64 40 Bytes max  */

  0x00,                   //High 8 bit of wMaxPacketSize

  0x01,                   /* bInterval: Polling Interval (1 ms) */  //160911 Used in 01,03 Transaction

  /* 34 */

  0x07,                   /* bLength: Endpoint Descriptor size */

  USB_DESC_TYPE_ENDPOINT,   /* bDescriptorType: = 5*/

  0x01,            /* bEndpointAddress: (OUT) = 1*/

  0x03,                   /* bmAttributes: Interrupt endpoint */ //160911 0-1bit定义了传输类型,00=控制,01=同步,10=批量,11=中断事务

  //160911 00=Control, 01=Isochronous, 10=Bulk, 11=Interrupt Transaction

  0x08,                   /* wMaxPacketSize: 64 40 Bytes max  */

  0x00,                   //High 8 bit of wMaxPacketSize

  0x01,                   /* bInterval: Polling Interval (1 ms) */  //160911 Used in 01,03 Transaction

  /* 41 */

 

#endif

 

} ;

加入

__ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =

{

  0x05, 0x01, // USAGE_PAGE (Generic Desktop)

  0x09, 0x06, // USAGE (Keyboard)

  0xa1, 0x01, // COLLECTION (Application)

 

  // 输入,第一个字节表示特殊功能键 LeftControl -- Right GUI

  0x05, 0x07, //     USAGE_PAGE (Keyboard/Keypad)

  0x19, 0xe0, //     USAGE_MINIMUM (Keyboard LeftControl)

  0x29, 0xe7, //     USAGE_MAXIMUM (Keyboard Right GUI)

  0x15, 0x00, //     LOGICAL_MINIMUM (0)

  0x25, 0x01, //     LOGICAL_MAXIMUM (1)

  0x95, 0x08, //     REPORT_COUNT (8)

  0x75, 0x01, //     REPORT_SIZE (1)

  0x81, 0x02, //     INPUT (Data,Var,Abs)

 

  // 输入,第二个字节是常值0,给OEM使用

  0x95, 0x01, //     REPORT_COUNT (1)

  0x75, 0x08, //     REPORT_SIZE (8)

  0x81, 0x03, //     INPUT (Cnst,Var,Abs)

 

  // 输入,第三到8个字节,用来表示最多同时6个按键按下

  0x95, 0x06, //   REPORT_COUNT (6)

  0x75, 0x08, //   REPORT_SIZE (8)

  0x25, 0xFF, //   LOGICAL_MAXIMUM (255)

  0x19, 0x00, //   USAGE_MINIMUM (Reserved (no event indicated))

  0x29, 0x65, //   USAGE_MAXIMUM (Keyboard Application)

  0x81, 0x00, //     INPUT (Data,Ary,Abs)

 

  // 输出,第一个字节前两位 分别表示两个LED灯状态

  0x25, 0x01, //     LOGICAL_MAXIMUM (1)

  0x95, 0x02, //   REPORT_COUNT (2)

  0x75, 0x01, //   REPORT_SIZE (1)

  0x05, 0x08, //   USAGE_PAGE (LEDs)

  0x19, 0x01, //   USAGE_MINIMUM (Num Lock)

  0x29, 0x02, //   USAGE_MAXIMUM (Caps Lock)

  0x91, 0x02, //   OUTPUT (Data,Var,Abs)

 

  // 输出,第一个学节后六位用常值0来填充

  0x95, 0x01, //   REPORT_COUNT (1)

  0x75, 0x06, //   REPORT_SIZE (6)

  0x91, 0x03, //   OUTPUT (Cnst,Var,Abs)

 

  0xc0        // END_COLLECTION

// The Feature report

}; /* CustomHID_ReportDescriptor */

 

main.c 中加入如下图所示代码,模拟键盘发送一些数据:

 

 

烧录默认代码,连上电脑可在电脑上看到对应多一个USB keyBoard设备:

 

    1. 到此,简单的USB_HID_KEYBOARD设备演示demo就完成了,烧录程序 ,接上电脑后,打开一个文本文件或PTT,可以看到会自动下翻!

 

 

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,每天都会有技术干货推出!!

 

 

文中资料下载,在公众号里给十三发消息:

下载|STM32基础系列教程24

 

关注十三公众号

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 基础系列教程 24 - USB_HID_key 的相关文章

  • oracle 9i下在线重定义表

    9i提供了联机重定义表的方法 可以让你在基本不影响原表的DML情况下修改表结构 实际上 联机重定义表并不是完全的联机重定义 在最后交换表名的时候会短暂地锁定原表和中间表 但这个过程很短暂 相对于传统方法来说 这是一个进步 9i提供了联机重定

随机推荐

  • 三千书源——愿成为整理最全的书源合集

    引言 古有弱水三千 今有三千书源 勿埋我心 三千大世界 三千书之源 随着 三千书源 渐渐变得充足起来 感谢收藏 希望可以多来看望勿埋我心 注意 现在主流是3 0书源 欢迎在评论区投稿不错的书源 软件下载 3 0 推荐使用 酷安 Github
  • MTSC2020

    MTSC2020中国互联网测试开发大会深圳站 于 2020 年 11 月 20 日至 21 日在深圳宝立方国际酒店召开 为中国质量保证行业奉上一场为期 2 天的技术盛宴 500 来自世界各地的测试精英们汇聚一堂探讨交流 来自阿里巴巴淘系技术
  • CTF新手题

    CTF Capture The Flag 是一种网络安全技能竞赛 它涉及到多个领域 如密码学 逆向工程 漏洞利用 Web安全等 每个比赛都会有多个题目 每个题目都有一个旗帜 玩家需要通过解决问题 攻击漏洞或破解密码等手段 获取旗帜并提交给比
  • MySQL最全面的优化技巧

    如果面试官问你 你会从哪些维度进行 MySQL 性能优化 你会怎么回答 所谓的性能优化 一般针对的是MySQL查询的优化 既然是优化查询 我们自然要先知道查询操作要经过哪些环节 然后思考可以在哪些环节进行优化 查询操作需要经历的基本环节 S
  • FBX SDK快速简笔(基本)

    FBX SDK快速简笔 摘至官方文档 因不开源 大部分地方官方文档中存在保密 以个人理解进行了一部分的推导 该文章免费并承诺不涉及如何利益 FBX模型的组织结构 FBX是以scene graph的结构来存储模型的所有信息 也可以认为是一个多
  • Weka内置特征选择算法整理

    属性评估方法 CfsSubsetEval 根据属性子集中每一个特征的预测能力以及它们之间的关联性进行评估 ChiSquaredAttributeEval 根据与分类有关的每一个属性的卡方值进行评估 ClassifierSubsetEval
  • Vue基础精讲 —— 详解Vue实例、Vue实例的属性和方法

    Vue实例 基本配置 在 build文件夹 下新建 webpack config practice js 配置文件 内容参考 const path require path const HTMLPlugin require html web
  • Flex4,textArea控件的htmlText属性

    它现在包含Text布局框架 Text Layout Framework TLF 而TLF可以作为许多 Spark text组件的基础 例如RichText RichEditableText TextArea和 TextInput等组件 以及
  • 突发奇想把云服务器刷成了黑群晖 ...

    大家好 我是鸟哥 一个半路出家的程序员 前两天准备把自己10年前买的戴尔电脑刷成黑群晖改造成一台家庭存储服务器 折腾了几天后结果把电脑刷成了蓝屏 彻底报废了 后来又突发奇想 准备把手头上的服务器刷成黑群晖 本以为是无法成功的事 结果却很顺利
  • Ubuntu安装Docker

    一 安装条件 1 操作系统要求 需要以下 Ubuntu 版本之一的 64 位版本 Ubuntu Kinetic 22 10 Ubuntu Jammy 22 04 LTS Ubuntu Focal 20 04 LTS Ubuntu Bioni
  • Oracle数据库预警信息阈值设置以及预警信息自动邮件发送到管理员邮箱

    当数据库处于不理想状态时 默认情况下会通过EM发出预警 也可以通过邮件发送给管理员 要设置电子邮件通知 可在EM上 1任何 Database Control 页中 单击页眉和页脚区中的 Setup 设置 链接 2 在 Setup 设置 页中
  • 工作遇到的问题:mybatis注解@Param和分页count

    目录 mybatis注解 Param 分页Count mybatis注解 Param 基于mybatis注解写sql 出现了一个对象映射问题 一开始我没用 Param 因为当时只有一个入参所以没写springboot是能识别到的 但是我后来
  • boost1.79编译

    系列文章目录 文章目录 系列文章目录 前言 一 编译 1 使用vs2019 命令行 用管理员身份运行 2 执行命令 2 第二种方法 3 boost编译动态库 参考 前言 boost自带一套编译工具bjam bjam本身是跨平台的 并且也要自
  • uni-app 后台升级 静默升级 uniapp 后台更新 静默更新 在线升级

    uni app开发到一段落了 最后的app更新好好搞一下 完美的收尾 哈哈哈 在uni app的文档中可以看到内置了HTML5 引擎 这样我们就可以通过JS语法直接调用Native Java接口通道 可调用几乎所有的系统原生Java API
  • ZIP 软件包管理

    ZIP 也是计算机文件的压缩的算法 原名 Deflate 真空 发明者为菲利普 卡兹 Phil Katz 他于 1989 年 1 月公布了该格式的资料 ZIP 通常使用后缀名 zip 主流的压缩格式包括 tar rar zip war gz
  • C#软件加序列号激活、试用期限

    道高一尺 魔高一丈 程序员想尽各种办法给软件加密 用户就想尽各种办法对软件破解 现在做软件试用限制 那么就讨论下软件的试用限制 总体来说 限制的方法有这么几种 1 时间限制 2 次数限制 以时间限制为例 主要是用户从安装之日起 限制用户使用
  • 2023华为OD机试真题【预定酒店/自定义排序】

    题目描述 放暑假了 小明决定到某旅游景点游玩 他在网上搜索到了各种价位的酒店 长度为n的 数组A 他的心理价位是x元 请帮他筛选出k个最接近x元的酒店 n gt k gt 0 并由低到高打印酒店的价格 输入描述 第一行 n k x 第二行
  • Github域名加上1s,在线VS Code阅读源码神器诞生

    近日 一款域名为 github1s 开源项目诞生了 正如他的名字所说 只要在 github 地址上面加上 1s 就能秒级用在线 VS Code 打开 github 项目 这可以说为开发者带来了巨大的便利 我们来看看这个项目打开后长什么样子
  • go get或go mod tidy报错 fatal: could not read Username for

    go get git xxxxx net CPC protocol module git xxxxx net CPC protocol git ls remote q origin in Users admin go pkg mod cac
  • STM32 基础系列教程 24 - USB_HID_key

    前言 学习stm32 USB接口使用 学会用CUBE工具快速创建USB设备工程及调试 关于usb的相关知道请读者提前准备并学习 当然如果不想深究其中原理的话 跟着本文来操作就可以实现基于USB的设备开发了 需要提示的是 stm32在使用us