限时福利领取


在嵌入式开发中,时钟配置是系统稳定运行的基础。20MHz晶振作为常见的外部时钟源,其配置不当可能导致系统时序混乱、外设通信失败等问题。今天我们就来深入聊聊这个话题。

时钟树示意图

1. 背景痛点分析

  • 系统时钟漂移:当RCC配置不当时,可能导致实际时钟频率偏离预期值,影响定时器、串口等外设时序
  • 晶振不起振:常见于负载电容不匹配或PCB布局不合理的情况
  • 功耗异常:错误的时钟分频设置可能使系统运行在非最优功耗模式下

2. STM32时钟树解析

STM32的时钟树可以看作是一个复杂的交通网络,20MHz晶振(HSE)只是其中一个入口。关键路径包括:

  1. HSE直接路径:20MHz可直接作为系统时钟
  2. PLL倍频路径:通过PLL可倍频至更高频率(如72MHz)
  3. HSI备用路径:当HSE失效时可自动切换至内部8MHz时钟

3. 寄存器级配置实战

以下是基于标准外设库的配置示例,着重注意HSERDY等待机制:

// 启动HSE
RCC->CR |= RCC_CR_HSEON;

/* 必须等待HSERDY标志置位 */
while(!(RCC->CR & RCC_CR_HSERDY));

// 配置PLL (20MHz*9/2=90MHz)
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PLLMUL) | RCC_CFGR_PLLMUL9;
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PLLSRC) | RCC_CFGR_PLLSRC_HSE;

4. 避坑指南

  • 负载电容计算:

    CL = (C1*C2)/(C1+C2) + Cstray
    其中Cstray通常取3-5pF
  • 示波器测量技巧:

  • 使用10X探头降低对电路的影响
  • 测量OSC_IN应看到正弦波
  • OSC_OUT应为方波

示波器测量图

5. 性能验证方法

  1. SysTick测量法:

    SysTick->LOAD = 0xFFFFFF;
    SysTick->VAL = 0;
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
    // ...延时后读取计数值换算频率
  2. 功耗对比数据:

  3. 直接使用HSE(20MHz):12mA
  4. 使用PLL(72MHz):18mA
  5. 使用HSI(8MHz):8mA

6. 延伸思考

在实际应用中,我们可以根据场景动态切换时钟源。比如:

  • 高性能模式:使用PLL倍频
  • 低功耗模式:切换到HSI
  • 睡眠模式:关闭PLL

这种策略可以显著优化系统功耗,但需要注意切换时的时序安全。

经过这次深入探索,相信大家对20MHz晶振的RCC配置有了更全面的认识。时钟配置看似简单,但细节决定成败,建议在实际项目中多验证、多测量。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐