电子说
要让 STM32F407 同时稳定运行 USB(OTG FS)、以太网(ETH)、CAN 三大功能,核心是选择能满足所有外设时钟精度要求、且适配 STM32F4 PLL 时钟树的 HSE 晶振 ——最佳方案是:HSE 频率选 25MHz,类型选「无源贴片晶振(Parallel Resonant 型)」,其次可选 8MHz 无源晶振(兼容性稍弱)。
一、选择核心逻辑:三大外设的时钟硬约束
STM32F407 的 USB/ETH/CAN 对时钟有明确要求,HSE 作为核心时钟源,必须同时满足:
| 外设 | 关键时钟要求 | 精度要求 |
|---|---|---|
| USB OTG FS | 必须提供 48MHz 精确时钟(来自 PLL_Q 分频输出) | ±0.25%(USB 2.0 标准) |
| 以太网(ETH) | RMII 模式需 50MHz 参考时钟(可由 PHY 自供或 MCU 输出);MAC 时钟来自 AHB1(168MHz 系统时钟下稳定) | ±1%(主流 PHY 要求) |
| CAN | 时钟来自 APB1(最大 42MHz,168MHz 系统时钟下由 APB1 4 分频得到) | ±1%(CAN 协议要求) |
同时,STM32F4 的 PLL 时钟树有固定规则(PLL 输入频率 1-2MHz 最优,PLL_Q 需分频出 48MHz),HSE 频率需适配这一规则,才能让系统时钟(SYSCLK)稳定跑满 168MHz(F407 最高性能)。
二、最佳 HSE 选择:25MHz 无源晶振
1. 频率选择理由:完美适配 PLL 时钟树,兼顾所有外设
STM32F4 的 PLL 时钟树配置逻辑(目标:SYSCLK=168MHz + USB=48MHz + ETH 兼容):
PLL 核心公式:PLL_OUT = (HSE / PLL_M) * PLL_N
为了 USB 输出 48MHz:PLL_OUT / PLL_Q = 48MHz → 最优解是 PLL_OUT=336MHz,PLL_Q=7(336/7=48,整数分频无误差);
为了 SYSCLK=168MHz:PLL_OUT / PLL_P = 168MHz → PLL_P=2(336/2=168);
为了 PLL 稳定:HSE / PLL_M = 1MHz(PLL 输入频率 1MHz 是最优区间)→ PLL_M=HSE(因 1MHz×PLL_M=HSE)。
当 HSE=25MHz 时,PLL 配置为:
PLL_M=25(25MHz /25=1MHz,满足 PLL 输入要求);
PLL_N=336(1MHz×336=336MHz,PLL_OUT 目标值);
PLL_P=2(336MHz/2=168MHz,SYSCLK 满速);
PLL_Q=7(336MHz/7=48MHz,USB 时钟精准)。
此时:
CAN 时钟:APB1 4 分频 → 168MHz/4=42MHz(符合 CAN 最大时钟要求);
ETH 时钟:25MHz 是以太网 PHY 的「标准参考频率」,PHY 可直接用 25MHz 晶振生成 50MHz RMII 参考时钟(无需 MCU 额外输出,简化配置、降低干扰)。
2. 类型选择理由:无源晶振(Parallel Resonant 型)
优先选 无源贴片晶振,而非有源晶振 / 温补晶振(TCXO),原因:
| 晶振类型 | 优势 | 劣势 | 适配性 |
|---|---|---|---|
| 无源晶振(推荐) | 成本低、体积小(贴片封装如 3225/2520)、功耗低、STM32F4 原生支持(仅需外接负载电容) | 需 MCU 提供振荡电路(简单) | ✅ 最佳选择(满足所有精度) |
| 有源晶振 | 精度极高(±1ppm)、抗干扰强 | 成本高、需额外供电(VCC/GND)、PCB 设计复杂 | ❌ 没必要(无源已满足精度) |
| 温补晶振(TCXO) | 极端温度下精度高(±0.1ppm) | 成本高、体积大、功耗高 | ❌ 仅极端环境(-40℃~85℃+)考虑 |
具体选型参数:
封装:优先 3225(3.2×2.5mm)或 2520(2.5×2.0mm)贴片(节省 PCB 空间),插件 HC-49S 也可(适合面包板 / 原型机);
精度:±10ppm(工业级,-40℃~85℃),严苛环境可选 ±5ppm(足够覆盖 USB±0.25% 要求);
负载电容:12pF(STM32F407 HSE 引脚典型推荐值,需与晶振规格书匹配,否则频率偏移);
频率容差:±10ppm(常温下),温漂:±10ppm(-40℃~85℃)。
三、次选方案:8MHz 无源晶振(兼容性备选)
若供应链中 25MHz 晶振不易获取,可选择 8MHz 无源晶振(经典通用频率),配置逻辑如下:
PLL 配置:PLL_M=8(8MHz/8=1MHz)、PLL_N=336、PLL_P=2、PLL_Q=7(与 25MHz 配置一致,同样满足 USB=48MHz、SYSCLK=168MHz);
ETH 适配:需 PHY 自带 25MHz 晶振生成 50MHz RMII 参考时钟(8MHz 晶振无法通过 MCU 直接生成 50MHz 整数分频时钟,需 PHY 自供);
优缺点:兼容性强(8MHz 晶振随处可得),但 ETH 配置需依赖 PHY 自供时钟,灵活性稍弱于 25MHz。
四、不推荐的频率(避坑)
12MHz/16MHz:虽能通过 PLL 配置满足 USB / 系统时钟,但 ETH 兼容性差(PHY 少见 12/16MHz 参考晶振);
26MHz:部分 PHY 支持,但晶振通用性不如 25MHz/8MHz,成本稍高;
32MHz 以上:PLL_M 分频后难以满足 1MHz 输入要求,PLL 稳定性下降。
五、关键配置注意事项(避免踩坑)
晶振布局:负载电容需紧贴晶振引脚(引线长度<3mm),避免电磁干扰(ETH/USB 对时钟干扰敏感);
PLL 时钟配置代码(HAL 库示例):
// 25MHz HSE 配置:SYSCLK=168MHz,USB=48MHz,APB1=42MHz(CAN)
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 1. 使能 HSE 并等待就绪
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; // HSE 不分频(25MHz)
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25; // 25MHz/25=1MHz
RCC_OscInitStruct.PLL.PLLN = 336; // 1MHz×336=336MHz
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 336MHz/2=168MHz(SYSCLK)
RCC_OscInitStruct.PLL.PLLQ = 7; // 336MHz/7=48MHz(USB)
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
// 2. 配置系统时钟、AHB/APB 分频
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB=168MHz
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1=42MHz(CAN)
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2=84MHz(ETH 等)
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
Error_Handler();
}
}
ETH PHY 时钟:若用 25MHz HSE,可将 PHY 的 XTAL 引脚直接接 HSE 晶振(需确认 PHY 支持 25MHz 输入),无需额外配置 MCO1 输出;
电源与复位:HSE 晶振启动时间约 1ms,需在代码中等待 HSE 就绪(HAL 库 HAL_RCC_OscConfig 已包含),避免时钟未稳定就启动外设。
总结
STM32F407 同时使用 USB/ETH/CAN 时,最佳 HSE 方案是 25MHz 无源贴片晶振(3225 封装,±10ppm,12pF 负载电容)—— 既完美适配 PLL 时钟树,满足所有外设的精度和频率要求,又能简化 ETH 配置,是工业级应用的主流选择。若 25MHz 晶振不可得,8MHz 无源晶振可作为备选(需 PHY 自供 50MHz 时钟)。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !