问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32F105 USB 问题

HID USB gd32f105

GD32F105 USB 问题 赏100家园币

Transformers2025-10-18
我用GD32F105RCT6 跑官方的HID例程的时候,是能正常工作的。
但是,一旦将端点时间间隔从0x20改成0x1的时候,端点1的OUT中断就无法触发了。改成0xa就看运气有时候能工作,有时候不能工作
感觉像是初始化的时候出现了问题。
用例程中的 HID IAP例程,默认就是0x1的,直接就无法工作。端点1的IN完全没问题。
我唯一改的地方就是,官方的板子用的25Mhz的晶振,我的板子用的是8Mhz的晶振,我把时钟改了一下。枚举都是正常的。
又试了一下GD32F303 GD32F103 GD32F205 GD32F407,都是没有这个问题的。
有没有大哥知道是什么问题吗

回答 +关注 2
4476人浏览 15人回答问题 分享 举报
15 个回答
  • 硬件配置、固件驱动、通信稳定性、兼容性
  • GD32F105 USB端点OUT中断问题,核心原因很可能是将外部晶振从25MHz改为8MHz后,USB时钟没有精确配置到48MHz,这与GD32F105系列特殊的时钟树结构有关。
    你提到的GD32F303/103/205/407等其他型号正常,而唯独GD32F105出问题,这指向了GD32F105系列在时钟树,特别是USB时钟生成路径上的特殊性。
    USB模块对时钟精度要求很高,必须稳定在48MHz。当时钟配置不准时,会导致USB通信时序错乱。你提到的端点时间间隔(bInterval)改小后问题加剧或变得不稳定,正是因为更短的时间间隔对时钟精度要求更高。
    GD32F105(属于GD32F10X_CL系列)的时钟树,特别是PLL部分,与其他型号相比更为复杂。它需要配置PLL1和一系列分频器(如PREDV0、PREDV1)来协同工作,才能为USB提供准确的时钟。如果只修改了`HXTAL_VALUE`(外部晶振值),而没有相应调整PLL1的倍频和分频参数,USB时钟就无法达到所需的48MHz。
    可以按以下步骤检查和修改你的时钟配置代码:

    1.  确认并修改晶振定义
        在代码中找到定义外部高速晶振(HXTAL)值的地方,确保它被设置为8MHz(8000000)。
      
        #if !defined HXTAL_VALUE
        #ifdef GD32F10X_CL
        #define HXTAL_VALUE ((uint32_t)8000000) // 确保这里是8000000
        #else
        #define HXTAL_VALUE ((uint32_t)8000000)
        #endif
        #endif
    2.  调整PLL配置参数
        这是最关键的一步。你需要修改PLL的倍频和分频参数,确保整个时钟树,特别是通向USB的时钟,最终能产生精确的48MHz。由于官方库通常默认使用25MHz晶振的配置,你需要手动调整。
       对于8MHz晶振,你需要重点关注并修改system_clock_xxx_hxtal() 这类函数中关于PLL1的配置部分。具体的配置参数(倍频系数、分频值)需要根据你所期望的系统主频来计算。
    3.  检查并计算USB时钟路径
        使用GD32F105的参考手册和数据手册中的时钟树图,仔细检查从HXTAL -> PLL1 -> PREDV分频器 -> 主PLL -> USB时钟的整条路径。确保所有倍频和分频参数的组合,最终能让USB时钟准确地锁定在48MHz。
  • GD32F105 USB端点OUT中断问题,核心原因很可能是将外部晶振从25MHz改为8MHz后,USB时钟没有精确配置到48MHz,这与GD32F105系列特殊的时钟树结构有关。
    你提到的GD32F303/103/205/407等其他型号正常,而唯独GD32F105出问题,这指向了GD32F105系列在时钟树,特别是USB时钟生成路径上的特殊性。
    USB模块对时钟精度要求很高,必须稳定在48MHz。当时钟配置不准时,会导致USB通信时序错乱。你提到的端点时间间隔(bInterval)改小后问题加剧或变得不稳定,正是因为更短的时间间隔对时钟精度要求更高。
    GD32F105(属于GD32F10X_CL系列)的时钟树,特别是PLL部分,与其他型号相比更为复杂。它需要配置PLL1和一系列分频器(如PREDV0、PREDV1)来协同工作,才能为USB提供准确的时钟。如果只修改了`HXTAL_VALUE`(外部晶振值),而没有相应调整PLL1的倍频和分频参数,USB时钟就无法达到所需的48MHz。
    可以按以下步骤检查和修改你的时钟配置代码试试:
    1.  确认并修改晶振定义
        在代码中找到定义外部高速晶振(HXTAL)值的地方,确保它被设置为8MHz(8000000)。
          #if !defined HXTAL_VALUE
        #ifdef GD32F10X_CL
        #define HXTAL_VALUE ((uint32_t)8000000) // 确保这里是8000000
        #else
        #define HXTAL_VALUE ((uint32_t)8000000)
        #endif
        #endif
    2.  调整PLL配置参数
        这是最关键的一步。你需要修改PLL的倍频和分频参数,确保整个时钟树,特别是通向USB的时钟,最终能产生精确的48MHz。由于官方库通常默认使用25MHz晶振的配置,你需要手动调整。
       对于8MHz晶振,你需要重点关注并修改 system_clock_xxx_hxtal() 这类函数中关于PLL1的配置部分。具体的配置参数(倍频系数、分频值)需要根据你所期望的系统主频来计算。
    3.  检查并计算USB时钟路径
        使用GD32F105的参考手册和数据手册中的时钟树图,仔细检查从HXTAL -> PLL1 -> PREDV分频器 -> 主PLL -> USB时钟的整条路径。确保所有倍频和分频参数的组合,最终能让USB时钟准确地锁定在48MHz。
  • 我把晶振换成25Mhz的,使用的官方的例程,完全没改动。
    烧入的是官方的HID IAP程序,通过HID调试助手向端点1发送数据,然后直接就卡死了。
    端点1的OUT中断还是没触发
  • cr315 发表于 2025-10-20 19:03
    可能是中断优先级或NVIC配置冲突

    主要的问题是改了时间间隔后就不触发OUT1的中断,优先级默认的应该没问题
  • jcky001 发表于 2025-10-20 22:06
    时间间隔参数可能触发硬件响应阈值问题。GD32F105的USB外设可能对过短的时间间隔无法及时处理OUT事务,导致 ...

    我也怀疑是这样,但是官方的例程有个hid iap的。我改了时钟之后,直接就不工作了。我打算找个25mhz的晶振试试
  • classroom 发表于 2025-10-20 18:02
    GD32F105的USB外设对时间间隔参数有隐含限制,或参数修改未正确生效。

    我翻了手册,没有找到这方面的资料
  • jcky001 发表于 2025-10-20 17:02
    时钟配置与USB时序不匹配?

        /* CK_PLL = CK_HXTAL * 12 = 8MHz * 12 = 96MHz */
        RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
        RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12);
       
        /* Simple configuration: use HXTAL directly for PLL */
        RCU_CFG1 &= ~RCU_CFG1_PREDV0SEL;
    用的8Mhz的晶振,这样配置usb就可以正常枚举了,端点1的IN是正常的。就是OUT不正常
  • 时间间隔参数可能触发硬件响应阈值问题。GD32F105的USB外设可能对过短的时间间隔无法及时处理OUT事务,导致中断丢失。
12下一页

您需要登录后才可以回复 登录 | 注册