• 正文
  • 相关推荐
申请入驻 产业图谱

STM32H5 开发指南:USBx 裸机实现 HID 双向通信(添加 OUT 端点)

05/20 13:59
1108
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

嵌入式开发领域,USB-HID 设备凭借免驱动、高兼容性的优势,广泛应用于工业控制、智能外设、消费电子等场景。但基于 STM32H5 芯片、采用 USBx 裸机协议栈开发 HID 设备时,开发者常遇到一个核心痛点:默认仅支持 IN 端点单向通信,上位机MCU 发送数据时频繁触发 STALL 报错,无法实现双向交互。本文结合意法半导体 LAT1658 官方经验文档,从问题根源、实操步骤、避坑要点三方面,详细拆解 STM32H5 基于 USBx 裸机添加 OUT 端点、实现 HID 双向通信的完整方案,为嵌入式开发者提供可直接落地的实操参考。

资料获取:经验分享 | LAT1658 STM32H5基于USBx裸机添加OUT端点实现HID类双向通信

1. 问题现象与核心根源

1.1 典型问题表现

开发者使用 STM32H5(如 NUCLEO-H563ZI)或 STM32C071 芯片,运行 USBx 裸机版Ux_Device_HID_Standalone官方例程时,出现明显单向通信限制:

  • 正常功能:MCU 可通过 IN 端点稳定向上位机发送数据,设备描述符、端口状态均显示正常;
  • 异常问题:上位机通过 OUT1 端点向 MCU 发送数据时,直接触发 STALL(传输挂起)报错,数据无法正常传输。

1.2 问题核心原因

该问题源于 USBx 协议栈的默认设计逻辑:标准 USB-HID 设备(鼠标、键盘)及默认自定义 HID(Custom)类,仅配置 IN 端点,无 OUT 端点属性。USBx 协议栈默认不支持 HID 类 OUT 端点传输,上位机发送数据时,协议栈无对应接收处理逻辑,直接判定传输异常并触发 STALL。

2. STM32H5 USBx 裸机 HID 双向通信实操步骤

基于 NUCLEO-H563ZI 开发板,参考官方 LAT1658 文档,分 7 步完成 OUT 端点添加与双向通信配置,全程基于 USBx 裸机开发,无需操作系统。

2.1 工程备份与重命名

复制官方例程NUCLEO-H563ZI\Applications\USBX\Ux_Device_HID_Standalone,重命名为Ux_Device_HID_Test,同步修改.IOC工程文件名称,避免覆盖官方源码,便于后续调试与对比。

2.2 STM32CubeMX 核心配置

打开重命名后的工程,完成 3 项关键配置:

  • 取消默认鼠标 / 键盘类,使能 HID Custom(自定义)类;
  • 开启 OUT 端点支持,配置端点地址、传输间隔、最大包长(MPS,默认 64 字节);
  • 设置 HID 事件缓冲区长度为 64、事件队列数为 8,确保数据缓存充足。

2.3 协议栈宏定义开启

在 USBx 配置文件中,手动启用 3 个核心宏,激活 OUT 端点传输能力:

#define UX_DEVICE_CLASS_HID_INTERRUPTOUT_SUPPORT  // 使能HID中断OUT端点
#define UX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT    // 开启双向端点传输
#define UX_DEVICE_CLASS_HID_RECEIVER_ERROR          // 接收错误处理

未开启该宏,所有端点配置均无效,是 STALL 报错的最常见原因。

2.4 描述符配置更新

添加OUT 端点设备描述符与HID 报告描述符,明确端点属性、传输参数,确保 USB 主机(电脑)识别 OUT 端点并建立通信链路。

2.5 IN 端点数据发送逻辑开发

USBX_DEVICE_HID_CUSTOM_Task任务函数中,编写数据发送逻辑:定时或触发式通过 IN 端点向上位机发送 64 字节数据包,完成 MCU→上位机单向通信。

2.6 OUT 端点数据接收逻辑开发

配置 OUT 端点接收缓冲区HID_Custom_RecvBuf,编写接收回调函数:上位机通过 OUT 端点发送数据时,协议栈自动将数据存入缓冲区,供 MCU 读取解析,实现上位机→MCU 数据传输

2.7 编译调试与功能验证

添加必要头文件,编译无报错后下载至 NUCLEO-H563ZI 开发板;通过 USB 调试工具验证:

  • MCU→上位机:数据稳定发送,无丢包;
  • 上位机→MCU:数据正常接收,无 STALL 报错,双向通信流畅。

3. 关键避坑要点

  1. 端点参数匹配:OUT 端点最大包长(MPS)建议按默认 64 字节配置,避免大小不匹配导致传输溢出或挂起;
  2. 缓冲区合理分配:收发缓冲区大小需适配端点 MPS,过小易溢出,过大占用芯片内存;
  3. 任务函数适配:官方例程默认是鼠标类任务函数,需改为USBX_DEVICE_HID_CUSTOM_Task,避免逻辑错乱;
  4. 宏定义必开启:OUT 端点支持宏是核心开关,未开启时所有配置均无效。

STM32H5 基于 USBx 裸机实现 HID 双向通信,核心逻辑是打破 USBx 默认单向限制,手动开启 OUT 端点支持、完成参数配置与收发逻辑开发。本文拆解的实操步骤,完全基于意法半导体官方经验文档,适配 STM32H5 全系列芯片,开发者可直接参考官方附件工程源码快速落地。

该方案无需复杂驱动开发,兼容 Windows、Linux 等主流 USB 主机,适用于自定义 HID 设备、工业控制模块、智能外设、传感器终端等嵌入式场景,为 USB 双向通信开发提供高效、低成本的落地方案。

相关推荐