STM32 时钟树与 RCC

本篇文章围绕 "时钟---时钟树---总线/寄存器---RCC" 展开,核心目标是建立对 STM32F103 时钟系统的宏观理解:CPU 和片上外设都不会"主动工作",必须在时钟驱动下按节拍运行;而不同外设需要不同频率,因此需要时钟源、倍频/分频、使能开关和统一组织成时钟树;最终这些配置都落到 RCC 寄存器上。


一、时钟的本质:MCU 的"指挥棒"

材料首先用指挥家、队列等比喻说明:CPU 能取指令、分析指令、执行指令,但前提是有人在"催促"它。这个硬件机制就是时钟。

关键结论:

  1. CPU 需要时钟驱动

    CPU 虽然能执行指令,但不会无缘无故主动运行,必须在时钟节拍下工作。

  2. 片上外设也需要时钟驱动

    串口、I2C、GPIO、定时器、ADC 等外设同样不会主动工作,都要在时钟推动下统一步调。

  3. 时钟信号是高低电平时序

    时钟源产生高低电平波形,形成方波。设备在上升沿或下降沿等节拍下工作。

  4. 时钟源是硬件实体,时钟信号是输出波形

    材料特别区分:

    • 时钟源:产生或提供时钟的硬件实体;
    • 时钟信号:该硬件最终输出到电路中的电信号波形。

二、为什么外设要先"开启时钟"?

材料从单片机设计者的成本敏感角度解释:

  • MCU 内部有很多外设,但用户不一定全部使用;
  • 如果不用某个外设,还让它持续被时钟驱动,就会白白耗电;
  • 因此每个外设的时钟输入都可以设计成可使能开关。

所以:

使用任意一个片上外设之前,通常要先使能它的时钟。

本质是:开启该外设对时钟的受理。

CPU 一般不需要单独使能,因为代码要一直执行;而 GPIO、串口、I2C 等外设通常要先开时钟。


三、时钟周期与时钟频率

对"频率"的形象解释:

  • 时钟周期 :一次完整波动所需的时间,必须包含一次高电平和一次低电平,也就是有且只有一个上升沿 + 一个下降沿。
  • 时钟频率:每秒输出的完整周期数,单位 Hz。

例如一个周期为 1 ms,则 1 秒可输出 1000 个周期,频率为 1000 Hz。

时钟方波越密集,设备工作越快;方波越稀疏,设备工作越慢。但不同设备有自己的工作节奏,所以需要倍频和分频。


四、倍频与分频:一个时钟源驱动不同频率设备

不同外设工作频率不同。材料列出的典型例子中:

  • CPU 内核:72 MHz;
  • GPIO:72 MHz;
  • USART1、SPI1:72 MHz;
  • USART2/3、I2C:36 MHz;
  • ADC:不超过 14 MHz。

如果给每个设备都配一个独立时钟源,不现实:功耗高、同步困难、成本高。因此采用:

  1. 倍频

    输入 1 个时钟周期,输出 n 个周期。典型硬件是 PLL 锁相环。

  2. 分频

    输入 n 个时钟周期,输出 1 个周期。分频器可固定系数,也可软件配置。

这样就能用一个时钟源,经过倍频/分频和使能开关,驱动不同频率的外设,并保持统一节拍。


五、STM32F103 的四个原始时钟源

材料强调 STM32F103 不止一个时钟源,主要有四个:

简称 全称 来源 典型频率
HSI High-Speed Internal 内部 RC 8 MHz
HSE High-Speed External 外部晶振 4~16 MHz,板上常用 8 MHz
LSI Low-Speed Internal 内部低速 约 40 kHz
LSE Low-Speed External 外部低速晶振 32.768 kHz

其中:

  • HSI、HSE 用于高性能部分,驱动 CPU、SRAM、总线和多数片上外设;
  • LSI、LSE 主要用于低速部分,如 RTC、独立看门狗;
  • STM32F103 默认使用 HSI 作为起始时钟源;
  • 最佳实践通常选择 HSE,因为精度更高;
  • 若 HSE 异常,CSS 时钟安全系统会自动切换到 HSI,避免系统完全停摆。

六、时钟树:把时钟功能集中设计成树形结构

材料先提出推测:如果每个外设都单独做时钟源、倍频、分频、使能,会导致大量重复电路,不符合 MCU 成本敏感的特点。因此要把时钟功能集中成一套硬件电路,对外以黑盒方式提供不同频率时钟,这就是时钟树。

时钟树的核心特征:

  1. 时钟源不止一个;
  2. 有倍频和分频功能;
  3. 有使能开关;
  4. 有选择器/复用器,可在多个输入时钟源中选择;
  5. 以树形结构从"树根"时钟源向"树枝、树叶"外设分发。

材料把完整时钟树分为三部分:

1. 第一部分:核心时钟树

负责驱动 MCU 内部大部分设备,是重点。

关键时钟包括:

  • PLLCLK:锁相环倍频输出;
  • SYSCLK:系统时钟,芯片根时钟;
  • FCLK:CPU 内核自由运行时钟;
  • HCLK:AHB 总线时钟;
  • PCLK1:APB1 外设时钟,最高 36 MHz;
  • PCLK2:APB2 外设时钟,最高 72 MHz。

典型关系可理解为:

HSE/HSI → 选择器 → PLL 倍频 → SYSCLK → AHB 分频 → HCLK → APB1/APB2 分频 → PCLK1/PCLK2 → 各外设。

材料用"树根---树干---树枝---树叶"简化:

  • 树根:HSI、HSE;
  • 树干:PLL、选择器、AHB 分频;
  • 树枝:APB1、APB2 预分频器;
  • 树叶:GPIO、USART、I2C、SPI、ADC、TIM 等外设。

2. 第二部分:低速时钟部分

主要服务 RTC 和独立看门狗:

  • RTC 可选 LSE、LSI 或 HSE/128;
  • 独立看门狗 IWDG 使用 LSI;
  • 这部分是 kHz 级慢节奏设备,不需要 MHz 级时钟。

3. 第三部分:MCO 时钟输出

MCO 可把内部选中的时钟信号输出到 GPIO 引脚,用途包括:

  • 给外部器件提供时钟;
  • 同步设备、节省成本;
  • 作为测试接口,用示波器验证内部时钟配置。

七、CSS 时钟安全系统

材料特别强调可靠性问题:如果唯一时钟源失效,系统会瘫痪。因此 STM32F103 核心部分有一内一外两个高速时钟源:HSI 和 HSE。

CSS 即 Clock Security System。其作用是:

  • 当检测到 HSE 失效时,硬件立即关闭 HSE 和 PLL;
  • 强制把 SYSCLK 切换到 HSI,典型为 8 MHz;
  • 这个过程由硬件完成,软件来不及干预,但会产生 NMI 中断供后续补救。

注意:

  • 只有 HSE 故障会自动降级到 HSI;
  • HSI 故障不会自动切到 HSE,规格书中没有这种机制。

这对工业、汽车等高可靠性场景很重要:HSE 停振时,CSS 可在毫秒级切换,让 MCU 至少继续运行并有机会上报故障或安全停机。


八、时钟树与总线、外设寄存器的关系

材料进一步把时钟树和总线结构打通。

1. 总线不是一根线

总线是一组线簇,通常包括:

  1. 地址总线:去哪里读写;
  2. 数据总线:具体数据;
  3. 控制总线:读/写方向、控制逻辑等。

材料把时钟线归入控制总线中理解。

2. CPU 操作外设的本质是寄存器拷贝

例如代码:

c 复制代码
*(uint32_t *)0x4001100C = 10;

本质是把数据写入目标外设寄存器。CPU 寄存器、总线、外设寄存器之间发生数据传递。

3. 寄存器由存储单元构成

一个 bit 存储单元需要:

  • 写入;
  • 读取;
  • 保持。

写入需要"写端有数据"且"开关闭合"。开关可由使能端上升沿触发闭合。多个存储单元共用一个使能端,就构成多位寄存器。

4. 使能外设的本质:寄存器控制与门开关

材料用与门解释开关:

  • 输入 A=1 时,输出等于输入 B;
  • 输入 A=0 时,输出恒为 0。

因此与门可以当开关。寄存器保存 1,就持续输出 1,开启与门;保存 0,就关闭与门。

所以:

配置寄存器 → 输出使能信号 → 打开外设时钟与门 → 外设获得时钟。

这就是"配置寄存器就是使能外设"的本质。


九、RCC:复位与时钟控制器

RCC 全称 Reset and Clock Controller,即复位与时钟控制器。

材料指出,时钟树分散在 MCU 内部,与总线设备共同布线;时钟生成器选择、倍频分频、外设使能等都需要配置,而配置的本质就是配置寄存器。RCC 就是专门负责这些整体配置的功能模块。

常见 RCC 寄存器包括:

寄存器 作用
RCC_CR 开关全部时钟源及就绪标志
RCC_CFGR 选时钟源、设分频、倍频、MCO 输出
RCC_CIR 时钟就绪/失钟中断使能与标志
RCC_APB2RSTR 复位 APB2 外设
RCC_APB1RSTR 复位 APB1 外设
RCC_AHBENR 开关 AHB 外设时钟
RCC_APB2ENR 开关 GPIO、TIM1、ADC、USART1、SPI1 等 APB2 外设时钟
RCC_APB1ENR 开关 TIM2~7、USART2/3、I2C、USB、CAN 等 APB1 外设时钟
RCC_BDCR 控制 RTC、LSE 及备份域复位
RCC_CSR 复位标志、LSI 开关等

例如 RCC_APB1ENR 中某一位对应某个外设时钟使能,写 1 就相当于打开该外设的时钟开关。

相关推荐
笨笨饿2 小时前
#142_VS Code.map文件插件的用法
git·python·stm32·单片机·嵌入式硬件·物联网·vim
Zw-awa3 小时前
让小车沿线转得顺:循迹位置环 PID
stm32
铅笔小新z3 小时前
【stm32】RTC(实时时钟)
stm32·单片机·实时音视频
糖糖单片机设计3 小时前
基于 STM32 的风力发电机控制系统
stm32·单片机·嵌入式硬件
企鹅的蚂蚁4 小时前
Zephyr RTOS 常用 API 详解:从 GPIO、线程到 CAN FD(附 STM32/FreeRTOS 对照)
stm32·单片机·嵌入式硬件·rtos·zephyr
铅笔小新z1 天前
【stm32】输入捕获-超声波测距
stm32·单片机·嵌入式硬件
Zw-awa1 天前
PID 的花样:先看懂模糊 PID 和单神经元自适应 PID
stm32
铅笔小新z1 天前
【stm32】全彩led灯(PWM)
stm32·单片机·嵌入式硬件
澄纸气1 天前
STM32 外部中断实战:对射式计数器和编码器计数器,两个实验跑通 EXTI
stm32·单片机·嵌入式硬件