ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入浅出 STM32(十七):多时钟源策略、总线分频逻辑与安全机制详解

深入浅出 STM32(十七):多时钟源策略、总线分频逻辑与安全机制详解 目录前言一、RCC 与时钟树的核心概念解析1.1 为什么需要时钟系统1.2 RCC 的定义与角色二、时钟信号的传输与“开关”机制2.1 时钟信号的本质2.2 从点到线再到面三、多时钟源的设计哲学与分类3.1 为什么需要多个时钟源3.2 四种时钟源详解3.2.1 HSI (High-Speed Internal)3.2.2 HSE (High-Speed External)3.2.3 LSI (Low-Speed Internal)3.2.4 LSE (Low-Speed External)四、时钟树的部分结构与运作机理4.1 时钟树的“树根”与“枝叶”4.2 关键组件解析五、时钟树的宏观逻辑与三大组成部分5.1 第一部分系统主时钟树核心驱动5.1.1 核心功能与地位5.1.2 为什么它最复杂5.2 第二部分RTC 实时时钟管理5.2.1 信号来源与处理5.2.2 学习策略5.3 第三部分MCO 主时钟输出5.3.1 MCO 引脚的作用5.3.2 学习策略六、深入解析主时钟树树根、树干与树枝6.1 树根原始时钟源6.2 树干锁相环与系统总线6.2.1 PLL 锁相环倍频6.2.2 SYSCLK 系统时钟6.2.3 AHB 总线预分频器6.3 树枝APB 外设总线6.3.1 APB1低速总线 / PCLK16.3.2 APB2高速总线 / PCLK2七、关键时钟信号详解与参数对照八、基于 STM32CubeMX 的时钟树可视化配置8.1 开启外部高速时钟 (HSE)8.2 时钟配置页面的“自动计算”逻辑8.2.1 输入频率设定8.2.2 目标频率的“逆向推导”8.3 为什么要这样配置频率选择的依据九、时钟安全系统 (CSS) 与默认机制8.1 默认时钟源机制8.2 时钟安全系统 (CSS)结语 云泽Q个人主页 专栏传送入口: 《C语言》《数据结构》《C》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32》《Python》⛺️遇见安然遇见你不负代码不负卿~前言大家好啊我是云泽Q欢迎阅读我的文章一名热爱计算机技术的在校大学生喜欢在课余时间做一些计算机技术的总结性文章希望我的文章能为你解答困惑~一、RCC 与时钟树的核心概念解析1.1 为什么需要时钟系统在深入 STM32 的 RCCReset and Clock Control复位和时钟控制器之前我们必须先搞清楚一个根本问题为什么单片机需要这么复杂的时钟系统首先我们要知道刚刚讲过的时钟源它为我们未来所有的片上外设提供时钟功能时其对应的时钟频率是相对固定的。但是我们芯片内部不同的片上外设它们的工作频率需求都不一样。有的外设跑得快有的跑得慢。因此我们必须通过时钟源经过分频、倍频来完成给不同的片上外设提供不同频率的时钟信号。这里所谓的“分频”和“倍频”最终这些功能是以谁为载体呢答案就是时钟树。时钟树就是承载这些复杂频率变换逻辑的物理结构。1.2 RCC 的定义与角色今天我们的话题叫做“RCC 与时钟树”。虽然时钟树的概念我们还没完全展开但在概念上得先立住。在 STM32F103ZET6 或者更广泛的 STM32F103 系列乃至大部分 ARM 架构的 MCU 领域中RCC 的全称是Reset and Clock Controller即复位和时钟控制器。RCC 最终属于我们整个 MCU 内部的一个片上外设。大家看系统结构图就能发现在 MCU 内部RCC 是作为一个独立的模块存在的。虽然严格意义上讲时钟树在 MCU 内部并没有一个直观的物理实体让我们直接“看到”但 RCC 就是这个系统的核心配置中心。你可以把 RCC 理解为一个巨大的配置中心。将来我们在开发时关于时钟源的选择、倍频分频系数的设置以及使能各种其他片上外设比如 GPIO、USART、SPI 等的操作基本都是跟 RCC 打交道。它不仅控制时钟还负责复位逻辑是连接底层硬件与上层应用的关键枢纽。RCC ≠ 时钟树但 RCC 控制时钟树打个比方来理解两者的关系如果把时钟树比作城市的供水管网系统包含水管、阀门、减压阀等那么RCC 就是自来水公司的控制室操作员也就是你的软件代码通过 RCC 这个控制室来打开/关闭管网中的各个阀门开关、调节减压阀的参数分频/倍频系数从而决定哪条管道有水、水压多大。对比项时钟树RCC本质时钟信号的传输路径和拓扑结构复位和时钟控制器配置模块角色被控制的对象“路”控制的主体“指挥者”包含内容开关、分频器、倍频器、多路选择器寄存器、配置逻辑、中断管理等可见性逻辑上存在参考手册中有结构图MCU 内部真实的硬件外设模块二、时钟信号的传输与“开关”机制2.1 时钟信号的本质为了理解时钟树我们先从最基础的逻辑门电路说起。时钟信号为了能够输送到具体的外设中间会经过一系列的逻辑控制。我们可以给这里设置一个**与门AND Gate**所对应的开关。这就好比我们上面的图输入端 A对应的是时钟信号本身。输入端 B对应的是我们软件配置的一个控制位Enable 位。将来我就可以通过给这个控制位加上0或1这样的高低电平来选择是否使能时钟树当中的某一个输出。当控制位为0时无论时钟信号怎么跳变输出永远是0时钟被切断。当控制位为1时输出端就会 faithfully 地复刻输入的时钟信号。这个过程就相当于我们在时钟树当中末端接各种各样的片上外设时前面都带了一个开关。未来我们想使能哪一个设备就把哪个设备的开关给它“闭合”了置 1。这就是为什么我们在初始化外设时第一步永远是要开启对应外设的时钟否则外设就像断了电一样根本无法工作。2.2 从点到线再到面有了前面这些铺垫尤其是结合我们下面画的简易草图虽然真实的 STM32 时钟树看起来很复杂但在逻辑上我们是能够“以小见大”的。目前我们可以看到我们刚刚是在认识这棵时钟树的骨架。但我们并没有做到完全理解这棵树。我只是把我们系统——也就是意法半导体那些系统提供的这棵时钟树的结构和我们之前那个简单的示意图做了一下对应。我们提取出来了我们所关心的各种要素看到了不同的时钟源。看到了时钟树必须有倍频和分频的功能。看到了它是需要有使能开关的。接下来我们把时钟树做了一个宏观上的认知之后下面就要尝试着真正去理解这个时钟树。如果说之前我们讲对应的这个时钟源和时钟信号的时候是以“点”到“线”的话那么下面我们就要由“线”再到“面”了。三、多时钟源的设计哲学与分类3.1 为什么需要多个时钟源在 STM32 中我们并不是只用一个时钟源而是设计了四种不同的时钟源。这背后的设计哲学主要基于以下三点考虑可靠性与冗余单点故障风险单一时钟源存在单点故障风险。如果因为高温、老化等原因导致唯一的晶振失效整个系统将彻底瘫痪。多时钟源提供了备份机制提升系统可靠性。例如当外部高速晶振HSE失效时系统可以自动切换到内部高速时钟HSI维持基本运行。功耗优化高频时钟源功耗较高而低频源更适合低功耗场景。多源设计允许系统按需切换。比如在电池供电的待机模式下关闭所有高频时钟仅保留低功耗的 LSI 或 LSE 来维持 RTC 或看门狗工作能极大延长续航。精度与成本的平衡不同外设对时钟频率和精度的需求差异巨大。CPU 需要高频高精度而看门狗只需要低频且对精度不敏感。为所有模块提供高精度高频时钟既浪费电又增加成本。3.2 四种时钟源详解STM32F103 系列主要包含以下四种时钟源3.2.1 HSI (High-Speed Internal)全称High-Speed Internal来源内部 RC 振荡器典型频率8 MHz特点由 MCU 内部 RC 振荡器提供无需外部元件启动速度快。但缺点是精度较低容易受温度漂移影响。通常作为系统启动时的默认时钟或者在 HSE 故障时的备用时钟。3.2.2 HSE (High-Speed External)全称High-Speed External来源外部晶振典型频率4~16 MHz我们常用的开发板选型通常是8 MHz特点需外接无源晶振和谐振电容。精度高稳定性好是主系统时钟的首选来源。物理实现一般板子上那个标着8.000的金属椭圆形元件就是 HSE 晶振。在逻辑图中虽然 HSE 物理上是外部器件但官方在逻辑上将其圈出作为一个整体因为真正实现时钟控制的放大电路、整形电路都在 MCU 内部。3.2.3 LSI (Low-Speed Internal)全称Low-Speed Internal来源内部 RC 振荡器典型频率40 kHz(约数)特点主要用于独立看门狗IWDG或者 RTC 的备用时钟。因为它不需要外部晶振即使主电源掉电只要有备用电池它也能工作取决于具体电路设计。3.2.4 LSE (Low-Speed External)全称Low-Speed External来源外部 32.768 kHz 晶振典型频率32.768 kHz特点专用于 RTC实时时钟功能。为什么是 32.768k因为这个数字是2 15 2^{15}215经过 15 次二分频后正好得到 1Hz 的秒脉冲非常适合做时间基准。特别注意带 “i” (internal) 的时钟源完全集成于 MCU 内部带 “e” (external) 的需外部物理晶振但其驱动电路在 MCU 内部整体在逻辑图中常被归入 MCU 模块。四、时钟树的部分结构与运作机理4.1 时钟树的“树根”与“枝叶”如果我们把时钟系统看作一棵树树根就是上述的四个时钟源HSI, HSE, LSI, LSE。树干是经过 PLL锁相环倍频后的系统主时钟SYSCLK。树枝是 AHB 总线、APB1 总线、APB2 总线文章后面讲。树叶是挂载在各个总线上的具体外设如 GPIO, USART, SPI, ADC 等。4.2 关键组件解析在复杂的时钟树图中有几个关键组件决定了时钟的走向选择器Multiplexer / MUX位于时钟树的主干路径上。它的作用是从多个输入信号中选择一个作为输出。例如系统时钟 SYSCLK 的来源可以选择 HSI、HSE 或 PLLCLK。这在软件层面是可以配置的知道输入有多个信号源选择器可以选择其中一个信号源作为自己的输出即可。PLL锁相环这是实现“倍频”的核心。因为外部晶振通常只有 8MHz而 CPU 想跑 72MHz就必须靠 PLL 进行倍频例如 9 倍频。同时PLL 也可以进行预分频。使能开关Enable Switch正如前面提到的“与门”原理在时钟树的末端通往每一个外设如 GPIOA, USART1, ADC1 等的线路上都有一个受 RCC 寄存器控制的开关。只有把这个开关打开置 1时钟信号才能流向该外设外设才能开始工作。五、时钟树的宏观逻辑与三大组成部分虽然官方参考手册中的时钟树逻辑结构看起来非常复杂线条纵横交错但如果我们将其拆解来看整体其实是被清晰地划分为三个主要部分的。理解这三部分的独立性能帮我们迅速抓住重点避免在复杂的连线中迷失。5.1 第一部分系统主时钟树核心驱动这是整个时钟树中最庞大、最复杂也是我们作为开发者最需要关注的部分。5.1.1 核心功能与地位这部分时钟树的主要任务是驱动我们所有的片上外设以及 CPU 核心。你可以把它想象成整个芯片的“心脏”和“大动脉”。无论是 CPU 的运算、内存的读写还是 GPIO、USART、SPI 等外设的工作全都依赖这部分提供的时钟信号。从系统结构图中可以清晰地看到Cortex-M3 内核、SRAM、Flash 接口以及 DMA 控制器这部分现阶段不用太关注都直接连接在 AHB 系统总线上而 AHB 总线的源头正是来自 RCC复位和时钟控制模块输出的SYSCLK。这意味着如果这部分时钟配置错误整个系统将无法运行。5.1.2 为什么它最复杂之所以这部分看起来特别复杂是因为它涉及到了倍频PLL、多级分频AHB Prescaler, APB1/2 Prescaler以及复杂的路由选择。它不仅要保证 CPU 跑在最高性能如 72MHz还要兼顾低速外设如 36MHz的需求同时还要处理 USB 等特殊外设对 48MHz 的严格要求。因此我们在后续的学习和配置中绝大部分精力都会花在这棵“主干树”上。5.2 第二部分RTC 实时时钟管理这一部分在逻辑上相对独立主要服务于特定的低功耗计时需求。5.2.1 信号来源与处理第二部分主要处理的是低速时钟信号。它的输入源通常有两个HSE 分频外部高速时钟HSE经过 128 分频后得到。LSE外部低速时钟LSE通常接一个 32.768kHz 的晶振。这些信号经过对应的选择器或复用器进行选择后输出给 RTCReal-Time Clock相关的外设进行管理。5.2.2 学习策略对于初学者或者在进行常规外设开发时这个第二部分我们可以暂时“不考虑”。除非你的项目涉及到掉电走时、日历功能或者极低功耗的定时唤醒否则它不会干扰我们对主系统的理解。在时钟树图中它位于左下角通过虚线框与主系统隔开也暗示了它的独立性。5.3 第三部分MCO 主时钟输出第三部分同样比较独立它的功能非常单一且明确——对外输出时钟信号。5.3.1 MCO 引脚的作用这部分电路主要负责将内部的主时钟信号System Clock或者其他时钟源如 HSI、HSE、PLLCLK引出到芯片的MCOMaster Clock Output引脚上。你可能会问把时钟引出来做什么这主要是为了调试。比如当你不确定单片机内部到底有没有起振或者实际运行的频率是不是你配置的 72MHz 时你可以用示波器探头夹住 MCO 引脚直接测量波形和频率。这是一种非常直观的硬件验证手段。5.3.2 学习策略和 RTC 部分一样这个 MCO 输出功能我们在基础学习阶段也暂时不关心。它不影响 CPU 和外设的运行逻辑。六、深入解析主时钟树树根、树干与树枝既然确定了第一部分是核心我们就来详细拆解这棵树。为了让大家更直观地理解我们可以借用一张简化的逻辑图将这棵复杂的时钟树形象地比喻为“树根”、“树干”和“树枝”。6.1 树根原始时钟源任何时钟系统都必须有一个起点这就是“树根”。在 STM32F10xxx 系列中狭义上的硬件时钟源主要有四个但在主时钟树中我们主要关注两个高速源HSI (High Speed Internal)高速内部时钟由芯片内部的 RC 振荡器产生频率通常为 8MHz。它的特点是免费、内置但精度受温度影响较大。HSE (High Speed External)高速外部时钟需要外接晶振通常是 8MHz精度高、稳定性好。关于“时钟源”定义的补充视角这里我们需要统一一下概念避免后续混淆硬件工程师视角狭义只有 HSI、HSE、LSI、LSE 这种物理振荡器才叫时钟源。软件工程师视角广义经过分频、倍频后形成的信号如PLLCLK、SYSCLK、HCLK、PCLK1等因为它们是驱动具体模块的直接来源所以在软件配置语境下我们也常把它们称为“时钟源”。融合视角我们可以把 HSE/HSI 叫做“原始时钟来源”而把后面衍生出来的叫“二级时钟源”。后续讲解中我们会根据上下文灵活使用这个词。在我们的板子上通常选择的外部 HSE 频率是8MHz。本质上时钟树就是一颗由 HSE 或 HSI 作为发生源从而扇出形成不同频率时钟的网络。6.2 树干锁相环与系统总线有了树根信号就要往上输送这就构成了“树干”。树干部分主要完成两个任务升频和分配。6.2.1 PLL 锁相环倍频由于外部晶振通常只有 8MHz而我们的 STM32F103 想要跑到最高的 72MHz这就需要“树干”中的核心组件——PLLPhase-Locked Loop锁相环。PLL 的作用就是倍频。它将输入的 8MHz 信号进行倍率放大例如 x9输出PLLCLK。这是系统能达到最高速度的关键。6.2.2 SYSCLK 系统时钟经过选择器SW系统可以选择 HSI、HSE 或 PLLCLK 作为最终的SYSCLKSystem Clock。SYSCLK是芯片的根时钟也是所有总线的源头。它的最高频率限制为 72MHz。6.2.3 AHB 总线预分频器SYSCLK出来后进入 AHB 预分频器。这里可以进行不分频/1或者分频。输出的信号它直接驱动 Cortex-M3 内核即 FCLK、SRAM、Flash 接口以及 DMA 控制器。也就是说CPU 跑得有多快内存读写有多快全看 FCLK。谁驱动CPU进行工作网上在查的时候呢很多的这种结论会告诉你是 HCLK 是用来驱使 CPU 来工作的也不能说他错了但是我来给大家解释一下这个权威信源应该从哪里找在意法半导体的参考手册里目前是找不到的主要原因意法半导体它其实就是相当于不需要给你披露这些。而对于CPU未来是通过输入针脚去灌入我们对应的时钟信号然后来驱动我们的片上外设所以权威信源应该从ARM的相关CPU手册中去找ARM全球官网当然其实从逻辑上讲 FCLK 和 HCLK 两个都是从同一根导线上引出来的所以对于C P U来讲这两根导线对于 CPU 是一样的。6.3 树枝APB 外设总线树干再往下分叉就变成了“树枝”也就是挂载各种外设的 APB 总线。STM32 将外设分为了两类分别挂在两根树枝上6.3.1 APB1低速总线 / PCLK1来源由 HCLK 经过 APB1 预分频器得到。频率限制APB1 上的外设最高只能承受36MHz。挂载设备这是一些相对低速或对时序要求不那么苛刻的外设例如 USART2/3、I2C、SPI2、TIM2-7通用定时器、DAC 等。配置注意如果你的 HCLK 是 72MHz那么 APB1 预分频器必须至少设置为 2 分频得到 36MHz 的PCLK1否则外设可能会损坏或工作异常。6.3.2 APB2高速总线 / PCLK2来源由 HCLK 经过 APB2 预分频器得到。频率限制APB2 是高速总线最高可以承受72MHz。挂载设备这里挂着一些高性能外设例如 GPIO所有端口、USART1、SPI1、TIM1/TIM8高级定时器、ADC1/2/3 等。配置优势因为 GPIO 和 ADC 通常需要较高的采样率或响应速度所以它们被放在了这条能跑满 72MHz 的总线上。七、关键时钟信号详解与参数对照时钟信号全称核心作用最高频率常规工作频率备注PLLCLKPhase-Locked Loop Clock锁相环输出倍频后的信号使系统可达最高速72 MHz72 MHz它是 SYSCLK 的主要来源之一SYSCLKSystem Clock芯片根时钟所有总线的源头72 MHz72 MHz决定了整个系统的基准节奏FCLKFree-running ClockCPU 内核自由运行时钟72 MHz72 MHz直接给 Cortex-M3 内核供电HCLKAHB ClockAHB 总线时钟驱动内存、DMA72 MHz72 MHz通常等于 SYSCLKPCLK1APB1 ClockAPB1 低速外设时钟36 MHz36 MHz挂载 I2C, USART2, SPI2 等PCLK2APB2 ClockAPB2 高速外设时钟72 MHz72 MHz挂载 GPIO, USART1, ADC 等八、基于 STM32CubeMX 的时钟树可视化配置理解了原理我们来看看在实际工程中是如何操作的。现在的开发工具 STM32CubeMX 极大地简化了这一步它把复杂的寄存器配置变成了可视化的“填空题”。8.1 开启外部高速时钟 (HSE)在进行任何高频配置前首先要告诉芯片“我有外部晶振”。在 CubeMX 的Pinout Configuration-System Core-RCC界面中找到High Speed Clock (HSE)选项。将其从Disable改为Crystal/Ceramic Resonator晶振/陶瓷谐振器模式。这一步对应了硬件上我们在 OSC_IN 和 OSC_OUT 引脚焊接了 8MHz 晶振的操作。如果不选这一项软件会默认认为你没有外部晶振后续也就无法选择 HSE 作为时钟源。8.2 时钟配置页面的“自动计算”逻辑切换到Clock Configuration标签页你会看到一张和参考手册几乎一模一样的时钟树图但它是可交互的。8.2.1 输入频率设定首先在左侧输入框确认你的晶振频率。对于我们的板子HSE 输入频率应填入8(MHz)。这是所有计算的基石。8.2.2 目标频率的“逆向推导”很多初学者不知道该怎么填那些分频系数。其实 CubeMX 提供了一个极其强大的功能你只需要告诉它结果它自动帮你算过程。操作演示假设我们要配置系统主频为 72MHzAPB1 总线为 36MHz。选择时钟源在System Clock Mux处点击选择PLLCLK。因为只有 PLL 才能把 8MHz 变到 72MHz。设定系统频率直接在HCLK (MHz)的输入框里填入72然后按回车。此时你会发现软件自动帮你计算出了 PLL 的倍频系数例如 x9并且自动把 AHB 预分频器设为了 /1。原本灰色的输入框变成了蓝色表示配置合法且已自动填充。设定外设频率接着看下方的APB1 Prescaler。如果你想让 APB1 跑在 36MHz你就在PCLK1的输入框里填入36按回车。此时你会发现软件自动把 APB1 的分频系数改成了2(即 72MHz / 2 36MHz)。核心技巧总结保头确保输入源选对HSE 8MHz。保尾直接在你想要的最终频率如 HCLK 72, PCLK1 36上填数字并回车。中间所有的 PLL 倍频系数、各级分频系数工具都会根据硬件限制自动匹配最优解。你完全不需要去算8 * 9 / 1 / 2这种算术题。8.3 为什么要这样配置频率选择的依据有同学可能会问“为什么 APB2 我要选 72MHz而 APB1 只能选 36MHz我能不能把 APB1 也超频到 72MHz”答案是取决于挂载设备的物理极限。APB2 设备像 GPIO、SPI1 这些设备手册规定它们最高能耐受 72MHz所以我们尽量给高一点响应速度快。APB1 设备像普通的 UART、I2C手册规定了它们最高只能跑 36MHz。如果你强行通过修改分频器给它 72MHz外设不仅无法工作甚至可能烧毁。低速够用原则对于一些简单的 GPIO 翻转或者低速传感器通信其实 9MHz 甚至更低都够用了。但在实际工程中为了统一管理和减少延迟我们通常会将总线跑满其允许的最高频率APB1 跑满 36MHzAPB2 跑满 72MHz除非你有特殊的低功耗需求。九、时钟安全系统 (CSS) 与默认机制最后我们要补充两个非常重要的系统级概念这关乎产品的稳定性。8.1 默认时钟源机制当你拿到一块新芯片或者复位后没有做任何时钟配置时它在跑什么答案是HSI (8MHz)。STM32 内部设计了一个默认机制如果软件没有显式地去切换时钟源系统就会一直使用内部 HSI 振荡器。8.2 时钟安全系统 (CSS)虽然 HSE外部晶振精度高但它有个致命弱点怕坏。晶振是物理器件可能会因为震动、老化或干扰而停振。如果系统正在依靠 HSE 跑 72MHz突然晶振停了CPU 就会瞬间“脑死亡”这在工业控制或汽车电子中是灾难性的。为了解决这个问题STM32 引入了CSS (Clock Security System)。工作原理CSS 是一个硬件监控电路。当你启用了 HSE 后CSS 就会在后台默默盯着它。一旦检测到 HSE 停振或故障硬件会立即自动将系统时钟源切换回HSI (8MHz)。后果与处理虽然切回 HSI 会导致系统频率瞬间从 72MHz 降到 8MHz程序运行变慢但至少系统还活着不会死机。同时CSS 会触发一个不可屏蔽中断NMI通知软件工程师“嘿外部晶振挂了我已经切回内部时钟了请赶紧保存数据或进行安全停机处理。”配置方法在 CubeMX 的时钟树图中你会看到一个Enable CSS的复选框通常在 PLL 选择路径附近。勾选它就等于给系统买了一份“保险”。结语
返回列表