1. USB 对时钟的要求
USB 外设通常需要精确的 48MHz 时钟(全速 USB FS 模式),这个时钟可以由以下方式提供:
-
HSI48(内部 48MHz RC 振荡器)
-
PLL(锁相环,例如从 HSI/HSE 倍频得到 48MHz)
-
外部晶振(HSE + PLL 分频/倍频)
如果你的 USB 驱动需要使用 内部 RC 振荡器(而不是外部晶振),那么 HSI48 必须启用,否则 USB 无法正常工作。
2. 当前配置的分析
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; // 明确启用 HSI48 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // 不使用 PLL
-
HSI48
被启用,说明 USB 可能依赖它。 -
PLL
被禁用,意味着 系统时钟(SYSCLK)不是来自 PLL,而是直接使用HSI
(通常 16MHz 或更低)。 -
USB 时钟(48MHz)由
HSI48
直接提供,而不是通过 PLL 分频/倍频。
3. 为什么这样配置?
-
低功耗设计:
-
PWR_REGULATOR_VOLTAGE_SCALE3
(最低电压模式)通常用于 低功耗场景。 -
直接使用
HSI
和HSI48
,而不启用 PLL,可以减少动态功耗。
-
-
简化时钟树:
-
如果 USB 只需要 48MHz,而 CPU 不需要高频运行,可以直接用
HSI48
供 USB 使用,HSI
供 CPU 使用,无需 PLL 参与。
-
4. 潜在问题
-
HSI48
精度较低:-
HSI48 是 内部 RC 振荡器,精度(通常 ±1%~2%)比外部晶振(±0.1%)差。
-
如果 USB 通信不稳定(如枚举失败、数据传输错误),可能需要改用 外部晶振 + PLL 方案。
-
-
系统时钟较低:
-
如果
SYSCLK
直接来自HSI
(例如 16MHz),CPU 性能可能受限。
-
5. 如何优化(如果需要)
如果 USB 需要更稳定的时钟或 CPU 需要更高性能,可以修改为:
// 使用 HSE(外部晶振) + PLL 生成 48MHz 供 USB 使用 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = ...; // 分频系数 RCC_OscInitStruct.PLL.PLLN = ...; // 倍频系数(最终输出 48MHz)
结论
-
当前配置适用于低功耗场景,且 USB 直接使用
HSI48
作为时钟源。 -
如果 USB 通信不稳定,建议改用 外部晶振 + PLL 方案以提高精度。
-
如果 CPU 需要更高性能,可以启用 PLL 提升
SYSCLK
频率(同时保持 USB 的 48MHz 时钟)。
如果你的 USB 驱动工作正常,说明 HSI48
的精度已经足够;如果遇到问题,可能需要调整时钟配置。