本篇文章围绕 "时钟---时钟树---总线/寄存器---RCC" 展开,核心目标是建立对 STM32F103 时钟系统的宏观理解:CPU 和片上外设都不会"主动工作",必须在时钟驱动下按节拍运行;而不同外设需要不同频率,因此需要时钟源、倍频/分频、使能开关和统一组织成时钟树;最终这些配置都落到 RCC 寄存器上。
一、时钟的本质:MCU 的"指挥棒"
材料首先用指挥家、队列等比喻说明:CPU 能取指令、分析指令、执行指令,但前提是有人在"催促"它。这个硬件机制就是时钟。
关键结论:
-
CPU 需要时钟驱动
CPU 虽然能执行指令,但不会无缘无故主动运行,必须在时钟节拍下工作。
-
片上外设也需要时钟驱动
串口、I2C、GPIO、定时器、ADC 等外设同样不会主动工作,都要在时钟推动下统一步调。
-
时钟信号是高低电平时序
时钟源产生高低电平波形,形成方波。设备在上升沿或下降沿等节拍下工作。
-
时钟源是硬件实体,时钟信号是输出波形
材料特别区分:
- 时钟源:产生或提供时钟的硬件实体;
- 时钟信号:该硬件最终输出到电路中的电信号波形。
二、为什么外设要先"开启时钟"?
材料从单片机设计者的成本敏感角度解释:
- 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 个时钟周期,输出 n 个周期。典型硬件是 PLL 锁相环。
-
分频
输入 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. 第一部分:核心时钟树
负责驱动 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. 总线不是一根线
总线是一组线簇,通常包括:
- 地址总线:去哪里读写;
- 数据总线:具体数据;
- 控制总线:读/写方向、控制逻辑等。
材料把时钟线归入控制总线中理解。
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 就相当于打开该外设的时钟开关。