STM32时钟系统RCC配置详解与时钟树深度解析——零基础入门STM32第X课(四十一)

主题 内容 教学目的/扩展视频
RCC时钟的设置 什么是RCC时钟,如何改主频,如何切换时钟源。认识需要时钟的各功能与总线。 学会主频的修改,了解各种功能的时钟开关与设计。

师从洋桃电子,杜洋老师


📑文章目录

  • 一、时钟树核心架构解析
  • 1.1 时钟树全景示意图解
  • 1.2 关键路径参数详解
  • 1.2.1 主时钟生成路径
  • 1.2.2 分频器配置规则
  • 二、时钟树关键模块详解
  • 2.1 主时钟源选择
  • 时钟源对比表
  • 2.2 外设时钟分配
  • 时钟使能规则
  • 三、时钟树配置实战案例
  • 3.1 72MHz主频配置流程
  • 3.2 USB时钟配置(扩展)
  • 四、时钟树重点参数速查
  • 4.1 频率限制表
  • 4.2 分频系数计算公式
  • 五、时钟树调试技巧
  • 5.1 时钟输出监测
  • 5.2 时钟状态检测
  • 六、相关资源

  • ▲ 回顾上期🔍STM32功能介绍—时钟、复位和电源 | 零基础入门STM32第五步


    (图1:STM32时钟树结构图)


    一、时钟树核心架构解析

    1.1 时钟树全景示意图解

    (根据时钟树图分析)

    HSI

    HSE

    PLLCLK

    HCLK

    PCLK1

    PCLK2

    时钟源

    分频/倍频器

    系统时钟SYSCLK

    AHB总线

    APB1总线

    APB2总线

    1.2 关键路径参数详解

    1.2.1 主时钟生成路径
  • HSE路径:4-16MHz → PLL倍频 → 72MHz SYSCLK
  • HSI路径:8MHz RC → 直接作为系统时钟或PLL输入
  • PLL配置:输入频率×2~16 → 输出最高72MHz
  • 1.2.2 分频器配置规则
    分频节点 分频系数 典型配置 输出频率
    AHB 1/2/4/8/16/64/128/…/512 1 72MHz
    APB1 1/2/4/8/16 2 36MHz
    APB2 1/2/4/8/16 1 72MHz
    USB 1/1.5 1.5 48MHz

    二、时钟树关键模块详解

    2.1 主时钟源选择

    // 时钟源切换代码示例
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  // 选择PLL作为系统时钟
    while(RCC_GetSYSCLKSource() != 0x08);      // 等待切换完成
    
    时钟源对比表
    时钟源 路径说明 应用场景
    HSI 内部8MHz RC → 直接使用或PLL输入 备用时钟/低功耗
    HSE 外部4-16MHz晶振 → PLL倍频 高精度主时钟
    PLLCLK HSI/HSE倍频后的时钟输出 系统主时钟

    2.2 外设时钟分配

    // APB1总线外设时钟使能(TIM2-4, I2C1等)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_I2C1, ENABLE);
    
    // APB2总线外设时钟使能(ADC1, SPI1等)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SPI1, ENABLE);
    
    时钟使能规则
  • APB1总线:最大36MHz,控制DAC、I2C、普通定时器等
  • APB2总线:最大72MHz,控制ADC、高级定时器、GPIO等
  • 定时器倍频:当APB分频≠1时,定时器时钟自动×2

  • 三、时钟树配置实战案例

    3.1 72MHz主频配置流程

    void RCC_Configuration(void) {
        // 1. 启用HSE晶振
        RCC_HSEConfig(RCC_HSE_ON);
        while(!RCC_WaitForHSEStartUp());
    
        // 2. 配置PLL(HSE作为输入源)
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 8MHz×9=72MHz
        
        // 3. 设置总线分频
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   // AHB=72MHz
        RCC_PCLK1Config(RCC_HCLK_Div2);    // APB1=36MHz
        RCC_PCLK2Config(RCC_HCLK_Div1);    // APB2=72MHz
    
        // 4. 配置FLASH等待周期
        FLASH_SetLatency(FLASH_Latency_2); // 72MHz需2个等待周期
        
        // 5. 切换系统时钟源
        RCC_PLLCmd(ENABLE);
        while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while(RCC_GetSYSCLKSource() != 0x08);
    }
    

    ▲ 完整工程代码示例⏬超级终端显示日历程序

    3.2 USB时钟配置(扩展)

    // 配置USB时钟为48MHz
    RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); // 72MHz/1.5=48MHz
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
    

    四、时钟树重点参数速查

    4.1 频率限制表

    模块 最大频率 配置要点
    SYSCLK 72MHz 需配合FLASH等待周期
    APB1 36MHz 定时器自动倍频机制
    APB2 72MHz 高速外设时钟源
    USB 48MHz 必须精确配置分频系数
    ADC 14MHz 影响转换精度,需降频使用

    4.2 分频系数计算公式

    APB1定时器实际频率

    f_{TIM} = \begin{cases} 
    f_{PCLK1} & \text{if } prescaler = 1 \\
    2 \times f_{PCLK1} & \text{otherwise}
    \end{cases}
    

    USB时钟计算

    f_{USB} = \frac{f_{PLLCLK}}{1.5} = 48MHz \quad (\text{当 } f_{PLLCLK}=72MHz)
    

    五、时钟树调试技巧

    5.1 时钟输出监测

    // 通过MCO引脚输出时钟信号
    RCC_MCOConfig(RCC_MCO_SYSCLK);  // 将SYSCLK输出到PA8引脚
    

    5.2 时钟状态检测

    // 检查HSE就绪状态
    if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == SET) {
        // HSE启动成功
    }
    
    // 获取当前系统时钟源
    switch(RCC_GetSYSCLKSource()) {
        case 0x00: printf("HSI作为系统时钟"); break;
        case 0x04: printf("HSE作为系统时钟"); break; 
        case 0x08: printf("PLL作为系统时钟"); break;
    }
    

    六、相关资源

    [1] 洋桃电子B站课程-STM32入门100步
    [2] STM32F103xx官方数据手册
    [3] STM32F103X8-B数据手册(中文)
    [4] STM32F103固件函数库用户手册(中文)
    [5] 超级终端显示日历程序


    💬 技术讨论(请在评论区留言~)


    📌 下期预告:下一期将探讨触摸按键的原理与驱动,欢迎持续关注!

    点击查阅🔍往期【STM32专栏】文章

    版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
    实测开发版:洋桃1号开发版(基于STM32F103C8T6)
    更新日志

  • v1.0 初始版本(2025-02-28)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32时钟系统RCC配置详解与时钟树深度解析——零基础入门STM32第X课(四十一)

    发表回复