STM32U5 系列已经全面改用 Azure RTOS USBx 协议栈,老版 ST USB Device 库不再支持。很多工程师想做 CustomHID 双向透传,却找不到例程、看不懂 USBx、配置完跑不起来。
ST 官方 LAT1350 应用笔记专门解决这个问题:从零开始,用 CubeMX + USBx 实现 CustomHID 64Byte 双向通信。本文把配置、代码、回调、收发逻辑全部整理成可直接复刻的工程步骤。
资料获取:【应用笔记】LAT1350 基于 STM32U5创建USBx_CustomHID通信
1. 先说重点:STM32U5 USB 生态变化
- STM32U5 不再使用旧 ST USB Device 库
- 必须用 Azure RTOS USBx(ThreadX 内核)
- 官方缺少 CustomHID 双向示例
- LAT1350 就是补全这个缺口的实战教程
适用型号:STM32U5xx 全系列
2. CustomHID 双向通信基础(看懂再动手)
- 使用 3 个端点
- EP0:控制端点(枚举、描述符)
- EP1(IN):设备 → PC 上传
- EP2(OUT):PC → 设备 下发
- 数据包大小:64 字节
- 通信方式:中断传输
- 双向同时支持:IN + OUT 必须同时使能
3. CubeMX 完整配置(一步不错)
3.1 开启 USB_OTG_FS
- Mode:Device Only
- VBUS:Disable(如果不需要)
3.2 时钟配置
- 确保 48MHz USB 时钟 稳定
- 来源:HSI / PLL
3.3 开启 ThreadX + USBX
- 选择:UX Device
- 开启:Custom HID
- 使能:UX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT
3.4 CustomHID 关键参数
- EP_IN:1
- EP_OUT:2
- Packet Size:64
- Interval:5ms
- 使能:INTERRUPT OUT SUPPORT
3.5 描述符配置
- VID/PID 自定义
- 打开:USBD_FRAMEWORK_BUILDER
4. USBx CustomHID 核心 API(必须记住)
ux_device_class_hid_event_set:设备发数据(IN)ux_device_class_hid_receiver_event_get:设备收数据(OUT)ux_device_class_hid_receiver_event_free:释放接收缓存USBD_Custom_HID_Activate:HID 激活回调USBD_Custom_HID_SetReport:PC 发送数据时触发
5. 工程代码 4 步写完
5.1 激活 HID 实例
VOID USBD_Custom_HID_Activate(VOID *hid_instance)
{
hid_custom = (UX_SLAVE_CLASS_HID*)hid_instance;
}
5.2 接收 PC 数据(EP2 OUT)
VOID USBD_Custom_HID_SetReport(...)
{
if(ux_device_class_hid_receiver_event_get(
hid_custom, &hid_received_event) == UX_SUCCESS)
{
// 读到数据:hid_received_event 缓冲区
memcpy(RecvBuf, ... , len);
ux_device_class_hid_receiver_event_free(hid_custom);
}
}
5.3 定时发送数据给 PC(EP1 IN)
VOID usbx_cutomhid_thread_entry(ULONG thread_input)
{
while(1) {
if (设备已配置 && hid_custom != NULL)
{
// 填充 64 字节
hid_custom_event.buffer[0] = 0xAA;
...
ux_device_class_hid_event_set(hid_custom, &hid_custom_event);
tx_thread_sleep(MS_TO_TICK(1000));
}
else
tx_thread_sleep(50);
}
}
5.4 添加自定义 HID 报告描述符
0x06,0x00,0xFF, // 厂商自定义页
0x09,0xFF, // 厂商自定义命令
0xA1,0x01, // 应用集合
// INPUT 64 字节
// OUTPUT 64 字节
0xC0 // end collection
6. 测试结果(LAT1350 实测)
- 设备每 1 秒主动上传 64 字节:正常
- PC 向 EP2 发任意数据:设备正常接收
- 双向同时通信:无丢包、无乱序
7. 最容易踩的 5 个坑
- 没开 OUT 端点 → 只能发不能收
- 没开启双向支持宏 → 接收回调不进
- 没调用 receiver_event_free → 只能收一次
- 报告描述符错误 → PC 识别异常
- 线程没跑、队列没初始化 → 不发数据
STM32U5 用 USBx 做 CustomHID 双向通信,只要:CubeMX 打开双向 + 实现 Activate/SetReport + 定时发送 + 正确报告描述符。就能稳定实现 64 字节双向透传。
阅读全文
469