当前位置: 首页 > news >正文

深入解析:STM32H743-ARM例程23-USB_HID

深入解析:STM32H743-ARM例程23-USB_HID

目录

  • 实验平台
  • USB_HID
  • HID设备特点
  • USB_HS原理图
  • STM32CubeMX生成工程
  • 实验步骤
  • 实验现象
  • 实验代码

实验平台

硬件:银杏科技GT7000双核心开发板-ARM-STM32H743XIH6,银杏科技iToolXE仿真器
软件:最新版本STM32CubeH7固件库,STM32CubeMX v6.10.0,开发板环境MDK v5.35

USB_HID

  USB HID是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。
  交换的数据存储在称为报表(report)的结构内,设备的固件必须支持HID报表的格式。主机在控制与中断传输中传送与要求报表,来传送与接收数据。报表的格式非常有弹性,可以处理任何类别的数据。
  设备除了HID接口之外,它可能同时还包含有其他的USB接口。例如影像显示设备可能使用HID接口来做亮度,对比,与更新率的软件控制,而使用传统的影 像接口来传送要显示的数据。USB扩音器可以使用实时传输来播放语音,同时使用HID接口来控制音量,震荡,与低音等。HID接口通常比传统的控制接口来得便宜。
  Wndows操作系统最先支持的HID设备。在windows98以及后来的版本中内置有HID设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。
在设计一个USB接口的计算机外部设备时,如果HID类型的设备可以满足需要,可以将其设计为HID类型设备,这样可以省去比较复杂的USB驱动程序的编写,直接利用Windows操作系统对标准的HID类型USB设备的支持。

HID设备特点

  1. 交换的数据储存在称为报表(Report)的结构内,设备的固件必须支持HID报表的格式。主机通过控制和中断传输中的传送和请求报表来传送和接收数据。报表的格式非常灵活。
  2. 每一笔事务可以携带小量或中量的数据。低速设备每一笔事务最大是8B,全速设备每一笔事务最大是64B,高速设备每一笔事务最大是1024B。一个报表可以使用多笔事务。
  3. 设备可以在未预期的时间传送信息给主机,例如键盘的按键或是鼠标的移动。所以主机会定时轮询设备,以取得最新的数据。
  4. HID设备的最大传输速度有限制。主机可以保证低速的中断端点每10ms内最多1笔事务,每一秒最多是800B。保证全速端点每lms一笔事务,每一秒最多是64000B。保证高速端点每125us三笔事务,每一秒最多是24.576MB。
  5. HID设备没有保证的传输速率。如果设备是设置在10ms的时距,事务之间的时间可能等于或小于10ms。除非设备是设置在全速时在每个帧传输数据,或是在高速时在每个微帧传输数据。这是最快的轮询速率,所以端点可以保证有正确的带宽可供使用。
    HID设备除了传送数据给主机外,它也会从主机接收数据。只要能够符合HID类别规范的设备都可以是HID设备。
      设备除了HID接口之外,它可能同时还包含有其他的USB接口。例如影像显示设备可能使用HID接口来做亮度、对比度的软件控制,而使用传统的影像接口来传送要显示的数据。USB扩音器可以使用实时传输来播放语音,同时使用HID接口来控制音量、低音等。
      HID类别设备的规范文件主要是以下两份:
        Device Class Definition for Human interface Devices
        HID Usabe Tables
    想了解更多HID知识可以参考连接http://www.usbzh.com/article/detail-76.html 。

USB_HS原理图

在这里插入图片描述

STM32CubeMX生成工程

我们参考前面章节STM32H743-结合CubeMX新建HAL库MDK工程,打开CubeMX软件,重复步骤不再展示,我们来看配置USB部分如下图所示:
在这里插入图片描述
在这里插入图片描述

实验步骤

  1. 我们打开实验工程文件,修改USB_hid.c文件
    在这里插入图片描述

找到USB接口描述符这里我们将bInterfaceProtocol的值改为1:(0 — NONE,1 — Keyboard(键盘),2 — Mouse (鼠标),3~255 Reserved)
在这里插入图片描述

  1. 修改报告描述符
    下载 HID Descriptor Tool (DT) HID描述符工具:
    官网下载:https://usb.org/sites/default/files/documents/dt2_4.zip
    打开 File->Open…->keybrd.hid
    在这里插入图片描述

我们可以看到HID键盘的描述符情况:
在这里插入图片描述
打开usbd_hid.c文件,找到HID_MOUSE_ReportDesc数组定义处(默认生产HID设备为Mouse,这里数组名不影响,只要里面的描述符是键盘的就行)。修改为对应:
在这里插入图片描述

实验现象

按下按键KEY1后,键盘自动输入“A”。
在这里插入图片描述

实验代码

  1. 主函数
extern USBD_HandleTypeDef hUsbDeviceHS;
uint8_t buffer[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
MX_USART6_UART_Init();
while (1)
{
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0)
{
buffer[0] = 0x02; //shift
buffer[2] = 0x04; //a
USBD_HID_SendReport(&hUsbDeviceHS, buffer, 8); //send
HAL_Delay(15); //delay
buffer[0] = 0x00;
buffer[2] = 0x00;
USBD_HID_SendReport(&hUsbDeviceHS, buffer, 8);
HAL_Delay(15);
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0)
HAL_Delay(15);
}
}
}
  1. usbd_custom_hid_if.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
};
http://www.gsyq.cn/news/51621.html

相关文章:

  • 2025 年 11 月广播设备厂家推荐排行榜,视讯广播,SI广播,数字IP广播,智能广播系统,定压功放,广播周边,广播话筒,广播机柜,SIP网络广播系统,公共广播系统公司推荐
  • 2025 年 11 月全自动智能点胶机厂家推荐排行榜,视觉定位点胶机,饰品/纽扣/拉链头/商标/钥匙扣/五金/徽章/线圈/硅胶/UV胶点胶设备公司精选
  • 2025 年 11 月试验机厂家推荐排行榜,拉力试验机,江都试验机,管材环刚度试验机,电子万能试验机,橡胶试验机,压缩试验机公司推荐
  • 2025 年 11 月家居智能制造系统厂家推荐排行榜:家居ERP,家居MES,家居CRM,家居ERP系统,家居MES软件,家居CRM产品公司推荐
  • Daibitx.EFCore.AutoMigrate:模块化架构下安全、可控的 EF Core 迁移方案
  • [LangChain] 19. 持久化记忆
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拉方钢厂家推荐排行榜,高强度结构钢,建筑机械用冷拉方钢,优质钢材厂家精选
  • *题解:P11364 [NOIP2024] 树上查询
  • 11.16方法
  • 2025 年 11 月智能吉他厂家推荐排行榜,无弦吉他,自动档吉他,伴奏吉他,MIDI吉他,创新科技与便捷演奏体验之选
  • 完整教程:Redis(69)Redis分布式锁的优点和缺点是什么?
  • 2025 年 11 月精密仪器厂家推荐排行榜,触摸仪表,手表锁具,测试针,医疗传感器,Pogopin声学弹簧公司精选
  • evalscope使用2-使用自定义数据集压测
  • 2025 年 11 月摩托车/机车厂家推荐排行榜:街车、跑车、巡航机车、越野摩托车品牌实力与市场口碑深度解析
  • (Kotlin高级特性三)Kotlin密封类(Sealed Class)在何时比枚举更适用? - 指南
  • 2025 年 11 月冷拉/冷拔扁钢厂家推荐排行榜,冷拉扁钢,冷拔扁钢,精密冷拉扁钢,高强度冷拔扁钢公司推荐
  • 20232309 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • CIO的能力
  • LangChain4j实战-工具(函数调用)Tools(Function Calling)
  • 小米路由器通过电脑使用手机usb共享网络联网教程
  • 第27天(简单题中等题 二分查找)
  • 题解:P14452 [ICPC 2025 Xian R] Follow the Penguins
  • 高安全性 PHP 2FA 开发指南:Authenticator 扫码验证实现方案
  • 20232417 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 各组件证书配置文件yml
  • jmeter查看天气/快递操作
  • 详细介绍:MySQL——用户权限和管理
  • Django F对象完全指南:数据库层面的字段操作
  • Why cant Google appear in New York?
  • [AGC001E] BBQ Hard 分析