扫码加入

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

STM32U5 USBx CustomHID 双向通信实战教程

03/17 14:07
469
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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 个端点
    1. EP0:控制端点(枚举、描述符)
    2. EP1(IN):设备 → PC 上传
    3. 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 个坑

  1. 没开 OUT 端点 → 只能发不能收
  2. 没开启双向支持宏 → 接收回调不进
  3. 没调用 receiver_event_free → 只能收一次
  4. 报告描述符错误 → PC 识别异常
  5. 线程没跑、队列没初始化 → 不发数据

STM32U5 用 USBx 做 CustomHID 双向通信,只要:CubeMX 打开双向 + 实现 Activate/SetReport + 定时发送 + 正确报告描述符。就能稳定实现 64 字节双向透传。

相关推荐