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

问答
赞0
评论
2025-11-09
赞0
你提到的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。
评论
2025-10-24
赞0
你提到的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。
评论
2025-10-24
赞0
烧入的是官方的HID IAP程序,通过HID调试助手向端点1发送数据,然后直接就卡死了。
端点1的OUT中断还是没触发
评论
2025-10-23
赞0
主要的问题是改了时间间隔后就不触发OUT1的中断,优先级默认的应该没问题
评论
2025-10-22
赞0
我也怀疑是这样,但是官方的例程有个hid iap的。我改了时钟之后,直接就不工作了。我打算找个25mhz的晶振试试
评论
2025-10-22
赞0
我翻了手册,没有找到这方面的资料
评论
2025-10-22
赞0
/* 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不正常
评论
2025-10-22
赞0
评论
2025-10-20
您需要登录后才可以回复 登录 | 注册