在嵌入式开发领域,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. 关键避坑要点
- 端点参数匹配:OUT 端点最大包长(MPS)建议按默认 64 字节配置,避免大小不匹配导致传输溢出或挂起;
- 缓冲区合理分配:收发缓冲区大小需适配端点 MPS,过小易溢出,过大占用芯片内存;
- 任务函数适配:官方例程默认是鼠标类任务函数,需改为
USBX_DEVICE_HID_CUSTOM_Task,避免逻辑错乱; - 宏定义必开启:OUT 端点支持宏是核心开关,未开启时所有配置均无效。
STM32H5 基于 USBx 裸机实现 HID 双向通信,核心逻辑是打破 USBx 默认单向限制,手动开启 OUT 端点支持、完成参数配置与收发逻辑开发。本文拆解的实操步骤,完全基于意法半导体官方经验文档,适配 STM32H5 全系列芯片,开发者可直接参考官方附件工程源码快速落地。
该方案无需复杂驱动开发,兼容 Windows、Linux 等主流 USB 主机,适用于自定义 HID 设备、工业控制模块、智能外设、传感器终端等嵌入式场景,为 USB 双向通信开发提供高效、低成本的落地方案。
1108