You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32开发Windows兼容HID设备遇Report字节对齐错误10求助

问题排查与修复方案

核心错误:ReportSize与ReportCount参数完全颠倒

你的报告描述符存在两处致命参数错位,直接触发了字节对齐错误:

  1. 按钮输入段的参数错误
    原代码中注释与实际值完全相反:

    0x75, 0x17,    //         ReportSize(1)
    0x95, 0x1,    //          ReportCount(23)
    
    • 0x75是ReportSize(单个数据单元的bit数),按钮为1bit/个,应设为0x01
    • 0x95是ReportCount(数据单元总数),23个按钮对应值为0x17(十进制23)
      修正后:
    0x75, 0x01,    //         ReportSize(1)
    0x95, 0x17,    //         ReportCount(23)
    
  2. 补位输入段的参数错误
    原代码逻辑混乱,23个按钮占23bit,需补3bit凑齐24bit(3字节)以满足字节对齐要求,补位应使用Constant类型填充无效位:
    原错误代码:

    0x95, 0x01,    //         ReportCount(1)
    0x75, 0x06,    //         ReportSize(23)
    

    修正后:

    0x75, 0x01,    //         ReportSize(1)
    0x95, 0x03,    //         ReportCount(3)  // 补3bit凑齐24bit(3字节)
    0x81, 0x03,    //         Input(Constant...)
    

报告长度修正

修正后输入报告总长度为:ReportId(1字节) + 按钮数据(3字节) = 4字节,需将报告及缓冲区长度定义为4字节,而非31字节,过长的缓冲区会导致Windows识别异常。

完整修正后的报告描述符

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
  0x05, 0x01,    //         UsagePage(Generic Desktop[0x0001])
  0x09, 0x07,    //         UsageId(Keypad[0x0007])
  // Block of usage
  0xA1, 0x01,    //         Collection(Application)
  0x85, 0x01,    //         ReportId(1)
  0x05, 0x09,    //         UsagePage(Button[0x0009])
  0x19, 0x01,    //         UsageIdMin(Button 1[0x0001])
  0x29, 0x17,    //         UsageIdMax(Button 23[0x0017])
  0x15, 0x00,    //         LogicalMinimum(0)
  0x25, 0x01,    //         LogicalMaximum(1)
  0x75, 0x01,    //         ReportSize(1)
  0x95, 0x17,    //         ReportCount(23)
  0x81, 0x02,    //         Input(Data, Variable, Absolute...)
  // 补位凑齐字节
  0x75, 0x01,    //         ReportSize(1)
  0x95, 0x03,    //         ReportCount(3)
  0x81, 0x03,    //         Input(Constant...)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION              */
};

额外注意事项

  • 确保USBD_CUSTOM_HID_REPORT_DESC_SIZE等于修正后描述符的实际长度(上述描述符总字节数为22,需将该宏定义为22)
  • 重新编译烧录后,在Windows设备管理器中卸载旧设备驱动,重新扫描硬件让系统识别新的HID配置

内容的提问来源于stack exchange,提问作者Mat_CF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:42:34