STM32 USB使用记录:HID类设备(前篇)

这篇具有很好参考价值的文章主要介绍了STM32 USB使用记录:HID类设备(前篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目的

USB是目前最流行的接口,现在很多个人用的电子设备也都是USB设备。目前大多数单片机都有USB接口,使用USB接口作为HID类设备来使用是非常常用的,比如USB鼠标、键盘都是这一类。这篇文章将简单介绍使用STM32实现相关内容。

基础说明

一些USB相关最基础的内容可以参考下面文章中 基础说明 部分:
《STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯》

USB设备通过一系列的描述符来描述自己,告诉主机自己是什么设备、具有什么功能等。描述符一些基本的说明如下:

  • 每一个USB设备只有一个设备描述符,主要向主机说明设备类型、端点0最大包长、设备版本、配置数量等等;
  • 每一个USB设备至少有一个或者多个配置描述符,但是主机同一时间只能选择某一种配置,标准配置描述符主要向主机描述当前配置下的设备属性、所需电流、支持的接口数、配置描述符集合长度等等;
  • 主机在获取配置描述符集合的时候会先获取一次标准配置描述符,然后根据里面的配置描述符集合长度属性值获取配置描述符集合的所有描述符信息,配置描述符集合有标准配置描述符、接口描述符、端点描述符、HID描述符;
  • 每一个USB配置下至少有一个或者多个接口描述符,接口描述符主要说明设备类型、此接口下使用的端点数(不包括0号号端点),一个接口就是实现一种功能,实现这种功能可能需要端点0就够了,可能还需要其它的端点配合;
  • 每一个USB接口下至少有0个或者多个端点描述符,端点描述符用来描述符端点的各种属性;
  • 端点是实现USB设备功能的物理缓冲区实体,USB主机和设备是通过端点进行数据交互的;
  • 一个USB设备有一个或多个配置描述符。每个配置有一个或多个接口,每个接口有零个或多个端点;
  • 字符串描述符就是用字符串描述一个设备的一些属性,描述的属性包括设备厂商名字、产品名字、产品序列号、各个配置名字、各个接口名字;
  • HID描述符只有HID设备才会存在;
  • HID设备至少有一个报告描述符;
  • 报告描述符主要作用就是描述主机和HID设备交互的数据,向主机说明这些数据中哪些位是用来做什么用的;

STM32 USB使用记录:HID类设备(前篇),RTOS与单片机相关,stm32,嵌入式硬件,单片机,USB,HID

HID类演示

使用 STM32CubeIDE 或者 STM32CubeMX 可以方便的建立 STM32 USB HID 的项目。这里直接进行配置演示,图中只列出最关键的内容。

启用USB接口:
STM32 USB使用记录:HID类设备(前篇),RTOS与单片机相关,stm32,嵌入式硬件,单片机,USB,HID

启用USB设备中间件:
STM32 USB使用记录:HID类设备(前篇),RTOS与单片机相关,stm32,嵌入式硬件,单片机,USB,HID

需要注意的是根据H750芯片数据手册中说明,这里USB时钟推荐使用48MHz,如果是使用 USB HS 外接PHY的话,时钟使用60MHz:
STM32 USB使用记录:HID类设备(前篇),RTOS与单片机相关,stm32,嵌入式硬件,单片机,USB,HID
STM32 USB使用记录:HID类设备(前篇),RTOS与单片机相关,stm32,嵌入式硬件,单片机,USB,HID

上面配置下默认生成的是 鼠标设备 在生产的代码中的 main.c 中添加几行代码即可测试效果:

int main(void)
{
  HAL_Init();
  MPU_Config();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();

  // 默认配置生成的鼠标设备每次向电脑发送四个字节数据,这些内容是在HID设备的报告描述符中定义的
  // buff[0] bit0 bit1 bit2 分别代表 左键、右键、中键
  // buff[1] X 轴位移 (-127~127)
  // buff[2] Y 轴位移 (-127~127)
  // buff[3] Wheel 滚轮 (-127~127)
  uint8_t buff[4] = {0, 10, 0 ,0}; // X轴设置了位移量

  while (1)
  {
	  extern uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len);
	  extern USBD_HandleTypeDef hUsbDeviceFS;

	  USBD_HID_SendReport(&hUsbDeviceFS, buff, 4); // 发送数据

	  HAL_Delay(1000); // 按照buff中的值,每秒电脑上的光标将向右移动一次
  }
}

STM32 USB使用记录:HID类设备(前篇),RTOS与单片机相关,stm32,嵌入式硬件,单片机,USB,HID
记住上图左边几个文件,后面会介绍其中一些内容。

编译程序下载到芯片中就可以查看效果了,每隔一秒光标会向右移动一次。

可以使用 USB Device Tree Viewer 工具来查看电脑上的USB设备:
https://www.uwe-sieber.de/usbtreeview_e.html
STM32 USB使用记录:HID类设备(前篇),RTOS与单片机相关,stm32,嵌入式硬件,单片机,USB,HID

代码分析

这里只是简单做个介绍。

首先是 main.c 中执行的 MX_USB_DEVICE_Init() 函数,该函数在 usb_device.c 文件中,函数内容如下:

void MX_USB_DEVICE_Init(void)
{
  // 初始化USB设备
  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) 
  // 初始化USB设备具体类型(这里是HID设备)
  USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID) 
  // 启动USB
  USBD_Start(&hUsbDeviceFS) 
}

FS_Desc 结构体在 usbd_desc.c 文件中定义,看名字就可以了解是前面基础说明中提到的各种描述符:

USBD_DescriptorsTypeDef FS_Desc =
{
  USBD_FS_DeviceDescriptor
, USBD_FS_LangIDStrDescriptor
, USBD_FS_ManufacturerStrDescriptor
, USBD_FS_ProductStrDescriptor
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
};

USBD_HID 结构体的相关内容主要都在 usbd_hid.h / usbd_hid.c 文件中,这两个文件就是库中默认的HID鼠标设备了,其中有HID描述符和报告描述符等。

这里的配置描述符描述设备为HID的鼠标、设备电流、输入输出端点等:

/* USB HID device FS Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  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 */
#if (USBD_SELF_POWERED == 1U)
  0xE0,                                               /* bmAttributes: Bus Powered according to user configuration */
#else
  0xA0,                                               /* bmAttributes: Bus Powered according to user configuration */
#endif /* USBD_SELF_POWERED */
  USBD_MAX_POWER,                                     /* MaxPower (mA) */

  /************** 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 Bytes max */
  0x00,
  HID_FS_BINTERVAL,                                   /* bInterval: Polling Interval */
  /* 34 */
};

报告描述符就描述了设备收发数据结构信息等内容:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
  0x05, 0x01,        /* Usage Page (Generic Desktop Ctrls)     */
  0x09, 0x02,        /* Usage (Mouse)                          */
  0xA1, 0x01,        /* Collection (Application)               */
  0x09, 0x01,        /*   Usage (Pointer)                      */
  0xA1, 0x00,        /*   Collection (Physical)                */
  0x05, 0x09,        /*     Usage Page (Button)                */
  0x19, 0x01,        /*     Usage Minimum (0x01)               */
  0x29, 0x03,        /*     Usage Maximum (0x03)               */
  0x15, 0x00,        /*     Logical Minimum (0)                */
  0x25, 0x01,        /*     Logical Maximum (1)                */
  0x95, 0x03,        /*     Report Count (3)                   */
  0x75, 0x01,        /*     Report Size (1)                    */
  0x81, 0x02,        /*     Input (Data,Var,Abs)               */
  0x95, 0x01,        /*     Report Count (1)                   */
  0x75, 0x05,        /*     Report Size (5)                    */
  0x81, 0x01,        /*     Input (Const,Array,Abs)            */
  0x05, 0x01,        /*     Usage Page (Generic Desktop Ctrls) */
  0x09, 0x30,        /*     Usage (X)                          */
  0x09, 0x31,        /*     Usage (Y)                          */
  0x09, 0x38,        /*     Usage (Wheel)                      */
  0x15, 0x81,        /*     Logical Minimum (-127)             */
  0x25, 0x7F,        /*     Logical Maximum (127)              */
  0x75, 0x08,        /*     Report Size (8)                    */
  0x95, 0x03,        /*     Report Count (3)                   */
  0x81, 0x06,        /*     Input (Data,Var,Rel)               */
  0xC0,              /*   End Collection                       */
  0x09, 0x3C,        /*   Usage (Motion Wakeup)                */
  0x05, 0xFF,        /*   Usage Page (Reserved 0xFF)           */
  0x09, 0x01,        /*   Usage (0x01)                         */
  0x15, 0x00,        /*   Logical Minimum (0)                  */
  0x25, 0x01,        /*   Logical Maximum (1)                  */
  0x75, 0x01,        /*   Report Size (1)                      */
  0x95, 0x02,        /*   Report Count (2)                     */
  0xB1, 0x22,        /*   Feature (Data,Var,Abs,NoWrp)         */
  0x75, 0x06,        /*   Report Size (6)                      */
  0x95, 0x01,        /*   Report Count (1)                     */
  0xB1, 0x01,        /*   Feature (Const,Array,Abs,NoWrp)      */
  0xC0               /* End Collection                         */
};

总结

这篇文章到这里先告一段落了,看似什么都没讲,因为这篇文章的目的是对 HID 整体有个印象。大部分时候实际开发中我们并不会去使用默认的鼠标类型HID设备,而是使用自定义的HID设备(Custom Human Interface Device Class)。而自定义设备中像是报告描述符等一些内容需要自行编辑,用来实现特定功能需求,比如HID设备用作双向透传等。这些内容将在下一篇文章中进行介绍。文章来源地址https://www.toymoban.com/news/detail-600521.html

到了这里,关于STM32 USB使用记录:HID类设备(前篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device

    最近有个需求,需要同时用usb键盘鼠标和虚拟串口等,因为平时没怎么研究过usb协议,所以自己写复合设备一直没有成功,然后正巧在github上看到了一个stm32的一个usb复合设备库,可以快速配置usb组合设备,并且支持超级多路串口 Gihub地址 https://github.com/alambe94/I-CUBE-USBD-Compo

    2024年02月09日
    浏览(63)
  • STM32设置USB HID模式

    使用USBHID模式与电脑、手机终端通讯,速率和准确率比虚拟串口和CH340转接速度要快。 在USB_OTG_FS中,选择Device_Only,其它默认。 在Middleware中的Class For FS IP中,如下选择 在Device Descriptor中可以按需要填写 设置USB频率为48Mhz 在Project Manager里,修改Heap和Stack的大小 在程序里main.c中

    2024年02月11日
    浏览(97)
  • STM32:Custom HID实现USB双向通信

    本文章主要讲了使用STM32的USB Device,实现控制板和电脑通信功能。从而实现,上位机对控制板进行调试。 USB Device可以有多种类型,实现双向通信的话,推荐使用Custom HID类型。 首先使用STM32CubeMx实现功能引脚配置并且生成对应的工程文件。   Middleware设置USB_DEVICE    配置时钟

    2024年02月13日
    浏览(42)
  • STM32 CubeMX USB_(HID 鼠标和键盘)

    STM32 CubeMX 自动生成的USB_HID是鼠标类型的:键盘类型要做一点小修改; 参考: STM32CubeMX学习笔记 USB鼠标HID描述符以及数据格式

    2024年02月14日
    浏览(35)
  • STM32 CubeMX配置USB HID功能,及安装路径

    STM32CubeMX学习笔记(46)——USB接口使用(HID自定义设备) STM32CubeMX实现STM32 USBHID双向64字节通信(下位机部分) STM32 USB HID设置(STM32CubeMX) 关于keil 5安装出现Fail to set path to Software Packs.问题解决方法

    2024年02月08日
    浏览(36)
  • STM32的USB HID通用模式,双向通讯USB数据库参数配置

    目录 一、 usb_desc.c 1.配置描述符 2.报文描述符 二、usb_prop.c 三、usb_conf.h 四、usb_endp.c #define USB_HID_IN_SIZE    26         /*发送数据大小*/ #define USB_HID_OUT_SIZE  0x08   /*接收数据大小*/ 1.配置描述符         配置USB设备为HID设备,配置IN端点1,发送数据;OUT端点2接收数据;

    2024年02月05日
    浏览(40)
  • STM32利用USB的HID与QT上位机通信

      之前使用kingst的逻辑分析仪,打开上位机软件,插上带usb的硬件就可以通信,也不需要打开串口什么的,感觉很方便,于是借用一个周末研究下这个技术。本文主要是用于记录自己学习的过程,顺便分享下学习感悟。 首先初略说下大体是怎么回事,就是单片机使用hid功能需

    2024年02月07日
    浏览(42)
  • STM32。USB HID,如何发送标准键盘的按键报告?

    我们要求STM32芯片的usb和windows电脑的USB接口进行连接,然后STM32芯片发送usb数据给windows电脑,实现电脑上按下一个f按键的效果。 下面开始操作: 使用STM32CubeMX生成代码,先选择对应的usb口 然后选择第三方软件,选择HID 然后点击生成代码,这时候就会生成usbd_hid.c相关的代码

    2024年02月12日
    浏览(46)
  • STM32自定义HID(模拟厂家设备)

    与上位机调试软件配合, QT编写的调试助手:QT HID调试助手 源码:源码链接 QT上位机教程:教程地址 笔者这边硬件是TM32F103RCT6 软件使用CubeMX生成HID设备 首先配置单片机的基本时钟,调试方式等 本文主要讲解USBHID配置 勾选如上图所示 勾选 下面是对这几种模式的简要介绍:

    2024年02月06日
    浏览(48)
  • STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 USB_OTG_FS为工作在Human Interface Device Class (HID)(人机接口设备类)模式下的USB_DEVICE(USB从机),利用上下左右四

    2024年02月19日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包