imuncle.github.io
imuncle.github.io copied to clipboard
STM32 USB HID
目前市场上USB设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID)。这里介绍如何实现HID类设备,以及如何在应用程序中对HID类设备进行访问。从Windows98操作系统开始,为HID类设备提供了通用的驱动程序,所以只要按照HID设备类的规范编写设备的固件程序,就能够让Windows系统自动识别设备,省去了复杂的驱动程序编写过程。
HID 协议简介
人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID设备不一定非要是这些人机交互设备,只要符合HID设备级定义规范要求的都可以认为是HID设备。HID设备有以下主要特点:
- 交换的数据存储在报告的结构内,设备必须支持HID报告格式。
- 每笔事务可以携带小量或中量的数据。低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1 024字节;
- 有最大传输速度的限制。低速设备最快10 ms一笔事务,最高速度为800 B/s;全速设备最快1 ms一笔事务,最高速度为64 KB/s;高速设备最快125 μs一笔事务,最高速度为24.576 MB/s。
- 没有传输速度的保证。
当插入USB设备后,主机会向设备请求各种描述符来识别设备。为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。图1显示了HID各种描述符之间的关系。事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符 。

从图中可以看出,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。还有就是HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。
USB设备有4种传输方式与主机进行通信: 控制方式、中断方式、批量方式和同步方式。每种方式都有它的应用领域。HID只支持控制和中断传输方式。如图2所示,HID设备必须要有默认的控制管道和一个中断输入端点;中断输出端点是可选的。

中断输出传输是USB1.1规范才有的内容,且必须获得Windows系统的支持。从Windows98 SE版本开始才支持中断输出传输方式,所以如果需要中断输出传输方式的设备应该选择相应的操作系统。下表列出了传输类型和相关情况。

USB协议定义了11种请求命令,通过这些请求来获得设备的信息及对设备进行设置。HID类设备除了要支持这11种标准的请求外,还要实现以下6种特定请求:
- Get_Report——主机用控制传输从设备接收数据,所有HID类设备都要支持这个请求;
- Set_Report——设备用控制传输接收主机的数据,设备可以不支持此请求;
- Get_Idle——主机读取设备当前的空闲速率,设备可以不支持此请求;
- Set_Idle——设置闲置状态,设备可不支持此请求;
- Get_Protocol——主机获得设备的当前活动是引导协议还是报告协议;
- Set_Protocol——在引导协议和报告协议间切换,设备如果支持系统引导(如键盘和鼠标),就必须支持Get_Protocol和Set_Protocol请求。
更多的有关USB协议的资料可以参考这个链接,里面整理了很多资料。
USB模拟鼠标
直接使用STM32CubeMX生成代码,配置过程如下:
先使能USB

然后将USB配置为HID设备类

这里有两个HID,不带Custom的是传统的HID设备,比如鼠标键盘,带Custom的则是自定义的HID设备,需要自己定义设备描述符,这里选择的是传统的HID设备类,STM32CubeMX默认生成鼠标设备,如果要模拟键盘需要手动修改相关的设备描述符(见参考链接)。
然后一切保持默认就行,当然PID、VID、字符串描述可以任意修改。
最后生成的代码即可。
然后我们可以模拟鼠标发数据看看效果。下面的代码实现了鼠标指针一秒钟右移十个单位:
uint8_t report[4]={0,10,0,0};
//......
while (1)
{
HAL_Delay(1000); //延迟 1000ms
USBD_HID_SendReport(&hUsbDeviceFS,report,4);
}
这里可以看到,鼠标数据共4字节,解释如下: byte1: bit0: 1表示左键按下 bit1: 1表示右键按下 byte2:x移动量(-128——127) byte3:y移动量(-128——127) byte4:滚轮移动量
参考
- 第三章:STM32MxCube生成USB程序---模拟鼠标(从机)---F407
- 第四章:STM32MxCube生成USB程序---模拟键盘(从机)
- 利用STM32CubeMX来生成USB_HID_Mouse工程
- STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
- 将触控USB实验改为插入USB,电脑关机
- 一步步实现stm32cube的usb之CUSTOM_HID当串口使用 (stm32F407discoery板)
- USB HID复合设备实例—键盘+鼠标
补充
最后再补充一个USB的DFU(Download Firmware Update Class)应用案例吧,不过我个人认为DFU简直鸡肋,太麻烦了,所以不会再单独写文章介绍,这里直接就扔个链接吧: