ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

嵌入式:理解RCC与时钟数

2026/8/23 9:14:34 拓冰建站 浏览量
嵌入式:理解RCC与时钟数 前言文章合集集合嵌入式系列https://blog.csdn.net/2401_88433210/category_13196870.html?fromshareblogcolumnsharetypeblogcolumnsharerId13196870sharereferPCsharesource2401_88433210sharefromfrom_link文章以STM32F103ZET6芯片为例来介绍一、时钟1. CPU你有没有想过你的 ARM‑CPU 能从 Flash 上读取代码并执行可是是谁让 ARM‑CPU 读取指令的你的 ARM‑CPU 能一直从 Flash 上读取代码并执行可是是谁一直让 ARM‑CPU 读取指令的警察能抓坏人 (CPU 能执行指令)但是是谁让警察抓坏人的✨ 任何计算机系统包括单片机CPU 也要被驱动。CPU 很聪明可以读取指令分析指令执行指令周而复始CPU 也很傻它必须在别人的催促下才能完成上面的工作这里 “催促” CPU 运行的硬件机制叫做时钟这里我们引出了一个概念时钟。时钟类似一个 “节拍器”以固定的频率给设备发送电信号催促目标设备进行工作CPU 不会主动执行需要在时钟这个外力的驱使下才能进行工作2. 片上外设在 MCU 内部除了 ARM‑CPU还有其他片上外设其他片上外设自己能主动工作吗不能。结论单片机内部几乎所有外设都不会主动工作他们全部都要在时钟的驱使下进行工作✨结论在硬件层面上所有的设备包括 CPU 或者外设都要在时钟的推动下统一步调进行工作3. 时钟开始工作下面例子是一个简单的示意图虽然真实情况会复杂很多但是我们可以通过该例子简单理解时钟的作用假设我们所有的设备在硬件特性上设计的时候都是收到高电平它才工作 (尽管事实会有差别)所有设备只有收到了高电平才会工作一次。换句话说时钟源可以控制所有设备的工作节奏。我们生成的高低电平 (时序)叫做时钟信号产生这部分高低电平时序的源头硬件我们叫做时钟源✨ 结论一有了时钟所有设备都会在统一时钟的节奏下步调一致且有节奏的进行工作。4. 成本敏感下面是一段单片机设计者的心理路程我是一款单片机的设计者我自己心里清楚单片机上未来会有很多的设备 (包括 CPU 和其他片上外设)但是这些外设不一定都会被将来的开发者同时使用如果开发者用不到某些设备还让这些设备在时钟的催促下做着无效的工作这样不就是白白浪费电力吗这样的话我设计出来的单片机功耗肯定高功耗高变相的不就是使用我的单片机的成本高那我设计的单片机在市场上就没有竞争力了啊而且还要满足用户自由选择片上外设是否需要使用的场景。那么怎样能保证功耗和功能两者兼顾既要又要呢所以可以在设计单片机和各种片上外设的时候让每个设备处理时钟信息变成可以设置使能的不就好了✨ 这样的话我在使用任何外设之前都是先使能它的时钟本质就是开启该外设对时钟的受理CPU 都要受理时钟因为代码要一直执行一般不需要使能这就是为什么我们要使用任意一个片上外设的时候需要先开启时钟的原因所谓的时钟方波本质就是高低电平画出来就是方波的样子5. 时钟频率有了上面的初步理解我们现在有一个初步的概念时钟信号的表现形式就类似下面的方波时序图而不同的设备有的当收到上升沿工作有的收到下降沿工作。这样就可以达到用方波时序控制设备沿着一定的节奏共同工作时钟生成的方波密集设备就工作的快时钟生成的方波疏松设备就工作的慢 (当然不同设备都有自己不同的工作节奏)。换句话说要理解时钟方波还有一个角度我们必须覆盖到的就是时钟输出快慢的问题。✨ 时钟频率是衡量时钟快慢的指标。时钟频率是指数字电路中时钟信号每秒输出的完整周期数单位为赫兹Hz先别扯什么 Hz 问题什么叫做时钟的一个完整周期啊时钟周期周期表示重复出现的最小完整动作对应的时间单元注意周期是时间单位时钟周期特指一次完整的波动所需要的时间这里的波动就是指 起始状态‑ 变化‑ 回到起始状态 的过程表现形式就是一定要有一次高电平一次低电平下面我们展开说明一个周期可以是下面的样子 (对比上面的方波时序图)无论一个周期图画成什么样子一个周期描述的是一次波动一个波动就是初始状态 - 变化 - 回到初始状态的过程所以一个周期就必然有且只有有一个上升沿 (变化) 一个下降沿 (回到初始状态) ✨ 一个周期一定要有一个上升沿 一个下降沿。而输出一个周期是需要花时间的假设是 1ms那么1S 内能输出多少个周期呢1S/1ms 1000 次。✨ 我们把每秒输出多少个周期数叫做时钟频率次数单位赫兹 (HZ)6. 倍频与分频前面为了方便我们认为所有的片上设备都是工作在一个时钟源对应的一个时钟节奏下可事实上不同的设备工作频率是不同的即需要的时钟频率是不同的。下图是AI 生成的 STM32F103ZET6 常见的外设的工作频率清单序号外设实际工作频率为什么是这个频率快速记忆1CPU内核72MHz系统主频PLL 直接输出2GPIO 端口如 PA 口72MHz挂在 APB2 上与系统同频3TIM1 / TIM8高级定时器72MHz挂在 APB2 上同频 72MHz4TIM2 / TIM3 / TIM4 / TIM5通用定时器72MHz虽然挂在 APB1 上但因预分频≠1硬件自动倍频为 72MHz5USART172MHz挂在 APB2 上用于产生精确波特率6SPI172MHz挂在 APB2 上可支持高速通信7USART2 / USART336MHz挂在 APB1 上PCLK1 限制在 36MHz8I2C1 / I2C236MHz挂在 APB1 上实际通信速度受自身协议限制 (≤400kHz)9ADC1 / ADC2 / ADC3≤14MHz最特殊的一个必须从 72MHz 分频到不超过 14MHz这些外设我们不懂暂时也不需要懂我们只看到了他们的工作频率确实是不同的。✨ 为什么外设的工作频率会不同硬件工艺功耗与散热通信协议精度要求等等理由这些知道就可以可是现在我们的设备工作都是在一个频率下怎么保证让不同的设备在不同的频率下工作呢给每一个设备搞一个时钟源不现实功耗高设备间同步是个大问题倍频与分频几乎所有的单片机选择的做法。倍频: 设计一套硬件电路增加时钟频率。其实就是输入 1 个时钟周期 (就是一对高低电平)转换输出成为 n 个时钟周期倍频器Frequency Multiplier是一个非常基础且重要的混合信号电路它的核心功能是将一个输入的低频时钟信号转换成一个频率更高、且波形节奏完全对应的输出时钟信号。常见的倍频器比如锁相环 (PLL , Phase‑Locked Loop)分频: 设计一套硬件电路减少时钟频率。其实就是输入 n 个时钟周期 (就是 n 对高低电平)转换输出成为 1 个时钟周期什么叫做分频器分频器Frequency Divider是一个非常基础且重要的数字电路它的核心功能是将一个输入的高频时钟信号转换成一个频率更低、但波形完全同步的输出时钟信号。有了倍频和分频的硬件电路设备那么如何用一个时钟控制源控制不同的设备让他们统一步调并且以不同的频率工作呢这样我们就可以用一个时钟控制源控制不同的设备让他们统一步调并且以不同的频率工作了。✨时钟的本质时钟是决策单片机片上外设什么时候工作的设备对单片机来讲时钟是发起者。其他片上外设是执行者大家在时钟的指挥棒下有序的工作CPU (Cortex‑M3) 是未来执行代码的地方但是也要在时钟的驱使下进行取指令、分析指令、执行指令的步骤在这里 CPU 和片上外设并无本质区别。7.硬件时钟源Q13FC13500004_C32346_Q13FC13500004_C32346采购信息-立创电子元器件商城X50328MSB2GI_X50328MSB2GI采购信息-立创电子元器件商城细节区分一下概念时钟源和时钟信号时钟源是 “产生或提供时钟的硬件实体”时钟信号是 “这个实体最终输出到电路中的电信号波形”。二、时钟树1. 像单片机硬件工程师一样思考有了关于时钟的宏观认识之后我们现在已经能大致理解时钟的作用时钟周期的概念更重要的是大致知道不同设备是如何在同一个时钟源下用不同的频率工作而且还能进行开关使能了。现在我们继续站在单片机设计者角度考虑如下推测如果只有一个时钟源万一这个时钟源因为极端情况 (高温线路老化等) 而无法正常工作那么整个系统都会瘫痪是的所以 STM32F103 系列的单片机不能只有一个时钟源具体几个取决于设计片上外设的工作频率是不同的时钟会存在多个虽然可以倍频 / 分频来满足不同片上外设的工作频率要求但是不同的时钟源自身频率最好有差别这样在覆盖更大的频率范围的同时还会让系统功耗更低功耗低不是因为频率有差别而是因为 —— 在不需要高频的时候可以选择低频时钟源来工作从而降低功耗。高速路双向 8 车道能满足交通要求在小区里面修双向 8 车道这种方法肯定也能满足交通要求但是没必要这样成本太高了。其实还有一个精度的考量✨所以我们推测STM32F103 可能会需要多种时钟源STM32F103 不同的时钟源频率不同既然可以有多个时钟源我可以给每一个片上外设都搞一个时钟源其中每一个时钟可能既要针对不同的设备进行使能还要分频倍频这样的话不就让 MCU 内部电路出现了大量重复的电路设计吗重复就意味着成本增加单片机 MCU 是成本敏感的设备这样肯定是不行的。所以我们要把时钟功能单独设计一套硬件电路黑盒式的对外提供特定频率的时钟这套硬件电路叫做时钟树。我们把之前的图逆置一下就是一棵树形结构未来的时钟源就是树根这个时钟源可以有多个真实 stm32F103 系列的 MCU 关于时钟树肯定更复杂但是无非就是对绿色区域的部分进行重新设计2. 时钟树结构认识下面我们再贴一张完整的时钟树电路图《STM32F103 参考手册 RM0008‑RCC 章节》上面的时钟树看起来很复杂但是最重要的功能包括最核心的特性我们之前已经见到过了时钟源不止一个要有分频和倍频功能要有使能开关3. 时钟源不止一个上图中红色框框的区域是 STM32F103 系列单片机提供的四个真正的原始时钟来源简称全称来源典型频率HSIHigh‑SpeedInternal内部 RC8 MHzHSEHigh‑SpeedExternal外部晶振4~16 MHz板子选型常用 8MHzLSILow‑SpeedInternal内部 RC40 kHzLSELow‑SpeedExternal外部 32.768kHz 晶振32.768kHz我们暂且不关心相关细节只需要知道未来可以从这四个硬件处得到最原始的脉冲信号。但是现在必须搞清楚这四个原始时钟源在什么位置OSC 全称Oscillator中文振荡器内部 (Internal)外部 (External)高速 (High‑speed)High‑Speed‑InternalHSIHigh‑Speed‑ExternalHSE低速 (Low‑speed)Low‑Speed‑InternalLSILow‑Speed‑ExternalLSE4. 要有分频和倍频功能上图中用蓝色方框选中的区域都是典型的分频和倍频功能只具有一个功能的比如 /2 之类的都是固定的分频系数其他分频器内部包含了多个系数比如 /1,2,4,5,16 等都是支持软件动态配置的常见的倍频器比如锁相环 (PLLPhase‑Locked Loop)圆圈圈出来的区域都是一个一个的选择器复用器只要知道输入有多个信号源选择器可以选择其中一个信号源作为自己的输出即可。 这些后面在软件上都是可以配置的。5. 要有使能开关上图中圈起来的区域就是一个一个的使能开关。三、时钟树理解在清楚了时钟树的基本元素构成了那么下面需要理解时钟树本身了上面的图略显复杂其实整颗时钟树我们可以分为三部分第一部分是时钟树最核心的内容负责 MCU 内部大部分设备的驱动工作第二部分主要是低频时钟来进行驱动 RTC 和看门狗第三部分主要是用来进行时钟输出的这里只关注第一部分即可第一部分这部分是时钟树的最核心部分也比较复杂也是和片上外设强相关的这部分搞清楚了时钟树就理解一大部分了下面我们将第一部分进行高度简化其本质上时钟树是一颗由 HSE 或者 HSI 作为发生源从而扇状式的形成不同频率的时钟的方式单片机上的 CPUSRAM 和几乎所有的片上外设比如 GPIO都是通过这棵树来进行时钟驱动的。下面我们重点来了解一些最常见的时钟时钟全称英文翻译核心作用最高频率常规工作频率PLLCLKPhase‑Locked Loop Clock锁相环时钟倍频输出使系统可达最高速72 MHz72 MHzSYSCLKSystem Clock系统时钟芯片根时钟所有总线的源头72 MHz72 MHzFCLKFree‑running Clock自由运行时钟CPU 内核自由运行时钟72 MHz72 MHzHCLKAHB ClockAHB 总线时钟AHB 总线、内存、DMA 时钟72 MHz72 MHzPCLK1APB1 ClockAPB1 外设时钟APB1 外设USART2/3、I²C、SPI2、TIM2‑4时钟36 MHz36 MHzPCLK2APB2 ClockAPB2 外设时钟APB2 外设GPIO、USART1、SPI1、TIM1、ADC时钟72 MHz72 MHz经过上面的学习现在我们已经能理解第一部分的构成了我们在回到之前的图中再看就能看懂了关于这部分还有最后一个问题✨ 如果只有一个时钟源万一这个时钟源因为极端情况 (高温线路老化等) 而无法正常工作那么整个系统都会瘫痪所以我们发现上面最核心的时钟树的第一部分最核心的 “原始时钟来源” 有两个那就是 HSI 和 HSE都是高性能一内一外。因为这部分都是驱动比如 CPUSRAM各种片上外设的所以频率要求一般都是 某 MHz 频率的。STM32F103 系列的 MCU默认使用的是 HSI 作为起始 “原始时钟来源”来驱动大部分 MCU 设备而最佳实践是我们一般选择 HSE‑作为 原始时钟来源因为它精度够高。但是如果万一使用过程中HSE 异常了那么时钟树会自动切换使用 HSI 作为替补 原始时钟来源而这个切换工作是由时钟树中第一部分的一个叫做 CSS 的硬件单元完成的。CSS 的全称Clock Security System时钟安全系统它有如下特性✨HSE 故障 → 自动切到 HSISTM32F103 的时钟安全系统CSS一旦检测到 HSE 失效无论 HSE 是 SYSCLK 还是经 PLL硬件会立即关闭 HSE 及 PLL把 SYSCLK 强制切换到 HSI8 MHz这个过程完全由硬件完成软件来不及干预但会产生 NMI 中断供后续补救HSI 故障 → 不自动切到 HSEHSI 是内部 RC 振荡器规格书里不存在 “HSI 失效检测” 与 “自动切到 HSE” 的机制。如果 HSI 因意外停振系统只能死机或复位。因此只有 HSE 故障时 MCU 才会自动降级到 HSI若想反向保护需要软件自己写监控逻辑。有了 CSS就可以在一定程度上避免 MCU 出现 HSE 停振导致设备都不运行带来的风险下面给一个例子在工业、汽车等对可靠性要求高的场景HSE 一旦停振PLL 和 SYSCLK 会立刻丢失CPU、外设、通信全部停摆CSS 能在毫秒级把时钟切到内部 HSI8 MHz至少让 MCU 继续运行并有机会上报故障或安全停机避免设备失控四、RCCRCC 的全称是 Reset and Clock Controller即复位与时钟控制器。现如今我们已经理解了时钟、时钟树、时钟树和设备总线的关系等等话题从之前的过程来看我们可以感受到时钟树是打散到整个 MCU 内部和总线设备共同布线的时钟树中关键的位置比如时钟生成器选择倍频分频操作使能外设等等都是需要被配置的。之前我们重点在时钟树本身上下面我们就要过渡到时钟树配置层面。✨ 结论所谓的配置就是配置寄存器我们经常听到我们要开启外设时钟假设开启 GPIO我们能理解本质是把 GPIO 设备的时钟线开关闭合使用 PCLK2 时钟线上面的时钟。 但是不太理解开关是什么配置具体是怎么配置1. 理解开关电路为了让大家理解下面用与门来讲解真实情况下具体情况具体分析这是一个与门输入 A1输入 B1 输出 1输入 A1输入 B0 输出 0输入 A0输入 B0 输出 0✨ 结论当输入 A1 的时候输出与输入 B 相同当输入 A0 的时候输入 B 输入无效这不就是开关吗注意开关很多这里只是其中一种2. 理解RCC用一堆寄存器来表示 MCU 内部常见的配置比如时钟生成器选择倍频分频操作使能外设复位设备等等。我们把这种专门负责 MCU 内部整体配置的功能模块叫做 RCC。RCC 的全称是 “reset and clock control”字面意思就是复位和时钟控制目前这里介绍 STM32F10x 系列的时钟和时钟树相关知识暂且先不管什么复位问题。而 RCC 内部用来配置的寄存器常见的有序号寄存器名全名复位值主要作用一句话记忆1RCC_CRClock Control Register0x0000 0083开 / 关全部时钟源 (HSI/HSE/PLL/LSI/LSE) 及就绪标志2RCC_CFGRClock Configuration Register0x0000 0000选时钟源、设分频、倍频、MCO 输出3RCC_CIRClock Interrupt Register0x0000 0000时钟就绪 / 失钟中断使能与标志管理4RCC_APB2RSTRAPB2 Peripheral Reset Register0x0000 0000一键复位挂在 APB2 上的高速外设5RCC_APB1RSTRAPB1 Peripheral Reset Register0x0000 0000一键复位挂在 APB1 上的低速外设6RCC_AHBENRAHB Peripheral Clock Enable Register0x0000 0014开 / 关 DMA、SRAM、CRC、FSMC、SDIO 等 AHB 外设时钟7RCC_APB2ENRAPB2 Peripheral Clock Enable Register0x0000 0000开 / 关 GPIO、TIM1、ADC1/2、USART1、SPI1 等 APB2 外设时钟8RCC_APB1ENRAPB1 Peripheral Clock Enable Register0x0000 0000开 / 关 TIM2~7、USART2/3、I²C1/2、USB、CAN 等 APB1 外设时钟9RCC_BDCRBackup Domain Control Register0x0000 0000控制 RTC、LSE32 kHz及备份域复位10RCC_CSRControl/Status Register0x0C00 0000读 “谁复位了我”清标志控制 LSI 开关配置寄存器即可设置对应的功能3. STM32CubeMX中的时钟树