• 正文
  • 相关推荐
申请入驻 产业图谱

USB 枚举失败时钟根源解析

4小时前
190
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1. 两块 NUCLEO 板硬件差异分析

MB2213(NUCLEO‑C562RE)、MB2310(NUCLEO‑C5A3ZG):

  1. USB 外围电路完全一致:包含 SINK 供电路径、ESD 防护器件、USB Type‑C 连接器、差分走线要求,原理图没有差异,排除 USB 硬件电路造成无法枚举。
  2. HSE 外部晶振硬件参数不同:MB2213 搭载 24MHz 外部晶振;MB2310 搭载 48MHz 外部晶振。

关键点:硬件晶振发生改变后,软件时钟配置必须同步修改,即便芯片内核、USB 外设完全一样。

资料获取:实战经验 | LAT1720 从NUCLEO-C562RE向NUCLEO-C5A3ZG移植USB示例

2. STM32C5 USB CK48 时钟链路原理

STM32C5 的 USB 外设工作需要专用 48MHz 时钟信号,时钟代号为CK48。 文档明确时钟链路逻辑:

USB 的 48MHz 时钟 CK48 来源于 PSIDIV3;PSI 模块的参考时钟源选择 HSE 外部晶振。

PSI(可编程串行内部)模块以 HSE 作为输入参考,再通过内部分频、倍频输出 PSI 主时钟,PSIDIV3 再进一步分频产生 USB 必需的 CK48。 如果 PSI 模块配置的参考晶振频率和真实硬件 HSE 晶振不匹配,PSI 输出时钟全部偏移,CK48 时钟偏离 48MHz 目标频率。USB 外设时钟时序错误,直接导致 USB 设备枚举失败,PC 识别不到设备。

3. 两处软件配置的作用解析

① mx_rcc_init()函数内 PSI 参考时钟配置

// NUCLEO‑C562RE原始配置
config_psi.psi_ref = HAL_RCC_PSI_REF_24MHZ;

// NUCLEO‑C5A3ZG修改后配置
config_psi.psi_ref = HAL_RCC_PSI_REF_48MHZ;

psi_ref参数告知 HAL‑RCC 驱动,当前给到 PSI 模块的 HSE 外部晶振物理频率;驱动基于该参数完成 PSI 内部倍频系数计算,用来输出目标 144MHz 的 PSI 主时钟。硬件晶振更换,该枚举参数必须同步更新。

####② stm32_external_env.h文件 HSE_VALUE 宏定义

// NUCLEO‑C562RE原始定义
#define HSE_VALUE 24000000UL

// NUCLEO‑C5A3ZG修改后定义
#define HSE_VALUE 48000000UL

HSE_VALUE是 HAL 库全局外部高速晶振数值,单位 Hz。HAL 库中全部时钟计算函数(PLL、超时、外设时序)均读取这个宏。如果该宏和真实硬件晶振不一致,除 USB 之外,系统时钟、UART 波特率、定时器都会发生计算偏差。

文档提示:也可以不在头文件修改,通过编译器预处理器全局定义 HSE_VALUE,避免修改头文件。

4. 修改一处配置依旧失败的底层原因

只修改mx_rcc_init()里面psi_ref,但是不修改HSE_VALUE,工程依旧无法正常工作。

  1. psi_ref只控制 PSI 模块本身倍频参数,可以保证 PSI 输出 144MHz,CK48 得到 48MHz;
  2. 但是 HAL 库其余时钟计算逻辑仍然读取旧的HSE_VALUE=24000000UL,全局时钟参数不一致;部分 USBX 中间件内部也会依赖 HSE_VALUE 做时序校验,造成 USB 运行异常。 两处配置是解耦的,两处必须同步修改,缺一不可。

5. 移植过程的潜在边界风险

  1. 芯片内核相同,但开发板外部晶振不一定相同,不能依靠芯片型号推断板载 HSE 频率;
  2. HSE_VALUE 头文件会被 CubeMX 重新生成覆盖,如果使用 CubeMX 工程,需要在 CubeMX 配置界面修改 HSE 晶振参数,防止代码生成时覆盖手动修改;
  3. 如果编译器预处理器已经全局定义 HSE_VALUE,头文件内#if !defined(HSE_VALUE)条件会跳过头文件内定义,修改头文件不会生效;
  4. CK48 时钟异常故障现象不一定是无法识别设备,部分场景会出现可以枚举,但是 USB 通信丢包、乱码。

相关推荐