实战经验 | 基于 STM32U5 创建 USBx_CustomHID 通信

cathy的头像
cathy 发布于:周五, 03/08/2024 - 12:11 ,关键词:

一、前言

某客户在使用 STM32U5 开发一款产品时需要使用到 USB Custom 进行双向通信,并反馈STM32U5 使用的是 Azure USBx 协议栈,不再支持 ST USB device 库。客户表示只熟悉 ST USB Device 库,对 USBx 协议栈与 API 没有任何使用经验。查阅目前所有 USBx 的例程,发现目前 USBx 均没有可参考的 Custom HID 双向通信范例,客户希望提供使用 USBx HID 进行双向通信的例程,这里简单介绍下利用 CubeMx 创建工程的实现过程。

二、USB 双向通信的几个基本知识点

首先,我们回顾一下 USB2.0 设备端与主机通信的基本原理及数据流,如下图所示。

1.png

设备描述符:向主机提供 USB 版本信息、支持的协议、供应商标识(VID)、产品标识(PID)、及制造商和产品字符串,支持的配置数量等信息。

配置描述符:提供特定设备配置的信息,如接口数量、设备由总线供电还是自供电、设备能否启动一个远程唤醒以及设备功耗。

接口描述符:对配置描述符中的接口信息进行描述,主要包括了接口号、类型以及该接口中的端点(Endpoints)数量等信息。

端点描述符 :用于向主机提供端点信息,主要包括了端点方向(IN/OUT)、传输类型(中断、批量bluck、同步、控制)以及数据包最大长度等信息。

三、USBx HID 设备端 API 介绍

USBx Device 协议栈内部实现了一套复杂的基于事件和消息驱动机制的数据流传输和控制传输逻辑,用户 Application 只需要使用其提供的 APIs 即可实现 USB 通信。USBx Device Stack 所提供的 APIs 如下:

2.png

四、USBx 实现 Custom HID 双向通信的步骤

(一) 系统外设、USB、USBx、Threadx 的添加和基础配置下面我们就使用 NUCELO-U575ZI-Q 基于前面所讲的 USBx Device stack APIs 来实现USB HID 双向通信。使用 STM32CubeMX 创建如下工程,工程基本配置如下。

3.png

USB 和 RCC 时钟系统配置如下:

4.png

配置 NUCLEO-U575-Q 为 SMPS 供电模式。

5.png

配置 USB 引脚及中断功能。

6.png

添加 ThreadX RTOS 协议栈。

7.png

添加 USBx 协议栈支持并配置协议栈。

8.png




9.png

10.png

设置 MX_USB_OTG_FS_PCD_Init 在 main()中不进行调用,并保存工程并生成代码。

11.png

(二) 代码的添加及修改

本例程目的是实现 USB Custom HID 双向通信。本例程共使用了 3 个 Endpoint,如下:

Eendpoint0(控制类型,IN/OUT)、Endpoint1(中断,IN)、Endpoint2(中断,OUT)。Endpoint0:系统默认控制管理端点,用于 Host 对 Device 传输控制和管理命令,如设备描述符、配置描述符等系统信息进行配置和查询。

Endpoint1:输入(IN)类型端点,用于向 Host 发送数据,在本例程我们创建了一个应用线程usbx_cutomhid_thread_entry(),以 1S 为周期向 Host 通过 Endpoint1 发送 64 字节的数据包。

Endpoint2:输出(OUT)类型端点,用于当 Host 向 device 发送数据时,USBx Stack 会自动调用 USBD_Custom_HID_SetReport()的回调函数,通过 Endpoint2 来接收 Host 所发送的数据包。

  1. 在 app_usbx_devich.h 中包含如下几个头文件。

12.png13.png

2. 在 app_usbx_device.c 中申明和定义如下结构,其中 ux_app_MsgQueue 消息队列用于实现USB 的动态管理。

14.png

15.png

3. 在 ux_device_customhid.h/.c 中添加如下申明和定义,并在相关相关函数内分别依次添加下图所示代码。其中线程 usbx_cutomhid_thread_entry 用于周期性通过 Endpoint1 向 host 发送 64 字节数据。

16.png

17.png

18.png

19.png20.png21.png

修改 HID SetReport 函数,接收由 PC 机向 OUT 端点(Endpoint2)发送的数据包。

22.png

在 usbx_customhid_thread_entry 中实现 IN 端点(Endpoint1)向 PC 机 1S 发送一次数据功能。
23.png

添加 HID report 描述符,我们使用 USB 官网 HID 报告描述符工具生成自定义 Custom HID report 描述符,该工具可以到网址 https://www.usb.org/document-library/hid-descriptor-tool   下载。

根据 USB 规范一个 HID 报告描述符至少应包括如下条目(Items)。

24.png

25.png

(三) 功能测试及验证

USB 设备端(Device)发送数据测试,在 usbx_customhid_thread_entry()线程里面每 1S 钟向 Host 发送一包 64Byte 字节数据,然后我们可以在 PC 机端可以看到已成功收到了数据。

26.png27.png

USB 设备端(Device)接收数据测试,我们在 PC 通过向端点 2 发送数据。在 STM32U5 上通过调试窗口我们可以看到 USB device 已经成功的接收到了数据。

28.png

关于利用 STM32U5 创建 USBx_CustomHID 通信的实现过程就介绍到这里,分享出来供有需要的同仁参考。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 25