STM32开发Windows兼容HID设备遇Report字节对齐错误10求助
问题排查与修复方案
核心错误:ReportSize与ReportCount参数完全颠倒
你的报告描述符存在两处致命参数错位,直接触发了字节对齐错误:
按钮输入段的参数错误
原代码中注释与实际值完全相反:0x75, 0x17, // ReportSize(1) 0x95, 0x1, // ReportCount(23)0x75是ReportSize(单个数据单元的bit数),按钮为1bit/个,应设为0x010x95是ReportCount(数据单元总数),23个按钮对应值为0x17(十进制23)
修正后:
0x75, 0x01, // ReportSize(1) 0x95, 0x17, // ReportCount(23)补位输入段的参数错误
原代码逻辑混乱,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
相关产品推荐
相关产品推荐

