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

STM32自制USB驱动在Windows下无法识别厂商字符串

问题:STM32自定义USB驱动字符串描述符导致Windows枚举失败

现象

  • 自主开发STM32 USB驱动,仅禁用所有字符串(将iManufacturer等字符串索引设为0)时,设备可正常枚举;
  • 当在设备描述符中设置iManufacturer为1后,设备在Windows下反复枚举失败,每次Setup请求后返回ZLP(零长度数据包);
  • 读写内存逻辑已验证正确,设备在MacOS下可正常枚举,当前VID和PID均为0x0000。

字符串描述符代码

const uint8_t String_0_LANGID[4] =
{
        4, 3,
        9, 4, // 0x0409 English strings only
};

const uint8_t String_1_ManufacturerID[18] =
{
        18, // Length
        3, // String descriptor
        'a', 0,
        'b', 0,
        'c', 0,
        'd', 0,
        'e', 0,
        'f', 0,
        'g', 0,
        'h', 0,
};

排查与解决方法

1. 验证字符串描述符返回的完整性

用USB调试工具捕获返回数据包,确认:

  • 字符串0的4字节完全匹配定义(长度0x04、类型0x03、LANGID 0x0904);
  • 字符串1的18字节无缺失或错误,每个ASCII字符的Unicode后缀(0x00)正常。

2. 正确处理GET_DESCRIPTOR的wLength参数

Windows主机请求字符串描述符时,可能指定wLength小于描述符实际长度,此时需返回请求长度与描述符长度的较小值,而非直接返回完整描述符或ZLP。示例逻辑:

uint16_t send_len = MIN(wLength, descriptor_len);
USB_SendData(ep0, descriptor_addr, send_len);

3. 更换合法VID/PID

Windows对VID/PID为0x0000的未分配设备枚举逻辑更严格,尝试使用测试用合法VID/PID(如0x1234/0x5678),排除非法ID导致的枚举限制。

4. 修复内存对齐与缓存问题

STM32 USB控制器读取描述符时,若数据位于缓存区域可能出现同步异常:

  • 给描述符添加内存对齐属性:
    const uint8_t String_0_LANGID[4] __attribute__((aligned(2))) = {...};
    
  • 将描述符存放在非缓存RAM区域(如STM32的SRAM1非缓存段)。

5. 检查端点0发送逻辑

  • 仅当发送长度为端点最大包大小的整数倍时,才需发送ZLP,避免错误触发ZLP;
  • 发送完成后正确清除端点中断标志,确保后续请求正常处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 02:23:12