资讯动态

深入浅出 STM32(十八):时钟树、总线与寄存器的底层联动机制

发布时间:2026/8/25 15:27:15 来源:尧图企业网站定制
目录前言一、MCU内部架构与时钟树的深度打通1.1 从“两张皮”到“合二为一”的认知跨越1.2 官方资料的局限性与自建理解模型1.3 总线的本质三类信号线的集合1.4 寄存器统一编址与CPU访问机制1.5 设备协同与时钟同步的关键作用二、时钟树如何驱动整个MCU2.1 时钟树与总线时钟线的物理映射三、MCU 寄存器配置的本质与存储单元原理3.1 配置的本质从 CPU 到外设的数据搬运3.2 存储单元的工作机制写入、读取与保持3.3 多位寄存器的构建并行锁存四、时钟信号与总线传输的协同机制4.1 朴素的数据传输模型4.2 时钟的核心作用同步控制的开关4.3 关于“同步”的深度理解五、MCU 内部架构全景时钟树与总线的打通5.1 从时钟源到 Cortex-M3 内核5.2 数据流动的完整路径5.3 一次完整的写操作复盘结语 云泽Q个人主页 专栏传送入口: 《C语言》《数据结构》《C》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32》《Python》⛺️遇见安然遇见你不负代码不负卿~前言大家好啊我是云泽Q欢迎阅读我的文章一名热爱计算机技术的在校大学生喜欢在课余时间做一些计算机技术的总结性文章希望我的文章能为你解答困惑~一、MCU内部架构与时钟树的深度打通1.1 从“两张皮”到“合二为一”的认知跨越在之前的文章中我们已经把时钟树的第一部分讲完了。这里要再强调一下现阶段我们只关心时钟树的第一部分其他部分等把第一部分用得特别熟之后后续在理解上直接拿过来用就能理解了。现在虽然第一部分理解了但还存在一个核心痛点感觉上还是不够通透。这就好比MCU内部有自己的结构图时钟树也有自己的图这两张图像是“两张皮”谁也不挨着谁。如果非要问外部输出对应的时钟信号是如何输出到不同平台上的虽然能勉强理解写代码也能勉强去写但就是缺乏一种“通透感”。所以我们需要再往前走一步做一下时钟树与总线设备结构的打通也就是把这两张图合二为一。1.2 官方资料的局限性与自建理解模型意法半导体ST的MCU确实封装的是Cortex-M3内核但具体包括Cortex-M3和其他片上外设是如何进行布线的以及它所定的原理ST官方并没有给我们披露。所以想深刻理解MCU内部结构和时钟树之间对应的关系包括时钟树和外设之间的关系其实在官方是找不到锁定解决方案的。既然没披露我们也得理解它。因此这里提出一种“造线方案”。这个方案并不是官方权威的只是关于后续的理解提出来让各位在理解这个事儿上面能够更通透。除非将来入职到相关半导体公司否则我们只能基于现有资料构建模型。当我们体会到这点至此才算把时钟树对应的由点到面的工作整体搭建成功。至此对于配置时钟树这个事儿脑袋当中就有画面感了。1.3 总线的本质三类信号线的集合在打通之前必须先明确总线的概念。总线并非单根导线而是由多根线组成的“线组”。在计算机系统中总线分为三类地址总线用于定位目标设备或存储空间。数据总线传输实际的数据内容。控制总线包含读写方向控制信号并特别强调其中包含一根时钟信号线CLK。每一个设备上通过桥设备接入到整个MCU内部的电路时是通过这三套线地址、数据、控制接入的。控制里包含时钟就这么理解。其实数据线和地址线也要接入到每个设备当中官方只不过为了图示清晰不可能画成几十根线那样工作量太大也没法看。1.4 寄存器统一编址与CPU访问机制片上外设如GPIO的寄存器数据类、控制配置类、状态类与内存统一编址CPU通过物理地址直接访问。当CPU执行写指令时例如代码块中的操作*(uint32_t*)0x4001100C10;CPU会将目标地址0x4001100C放到地址总线、数据10放到数据总线、写信号放到控制总线。这个信号经总线矩阵和桥接设备如AHB到APB桥最终送达目标外设的对应寄存器。根据访问地址系统会判定这是外设访问从而走相应的总线路径。1.5 设备协同与时钟同步的关键作用CPU、总线矩阵、桥、外设等均为独立设备数据传输需各环节“打通”并协同工作。这种协同必须依赖同步机制而同步的核心载体正是控制总线中的时钟信号线。所有设备需在同一时钟节拍下完成“发送-接收”动作。当我们把视角切换到外设角度因为主要是MCU控制外设所以从外设角度看你的时钟线就可以接入到不同的平台上了。其实时钟树和这个是关联的。最终的结果逻辑上这是一个时钟树以外设角度时钟线接入不同平台。二、时钟树如何驱动整个MCU2.1 时钟树与总线时钟线的物理映射为了打通理解我们需要将时钟树的各个分支输出视为物理时钟信号线。例如将HCLK、PCLK1、PCLK2等分支输出视为物理时钟信号线并将其接入到对应总线AHB、APB1、APB2的内部时钟线上。所有连接到这些总线上的设备CPU、内存、外设都通过这根共享的时钟线接收同步信号。这就是为什么我们在配置时钟树时实际上是在配置这些物理连线的通断和频率。三、MCU 寄存器配置的本质与存储单元原理3.1 配置的本质从 CPU 到外设的数据搬运当我们站在配置视角来理解 MCU 时首先要打破一个迷思很多人觉得“配置外设”是一件很高深、很特殊的事情。但实际上对片上外设做配置本质上就是修改寄存器。不管你是修改数据寄存器还是修改配置寄存器在硬件底层看来读写配置寄存器和读写数据寄存器没有任何区别它们统统都是“读写寄存器”的操作。只不过当你把数据写进特定的地址配置寄存器时它就起到了配置的作用写进另一个地址数据寄存器时它就代表了数据。所以我们要讨论的核心问题归结为一点CPU 究竟是如何把数据写到外设里的这就涉及到了数据在总线上的流动路径。我们知道MCU 内部有三套关键的线路在跑信号数据总线上面跑的是实实在在的数据比如你要配置的数值10。地址总线上面跑的是目标地址告诉系统这个数据要写给谁。时钟线上面跑的是时钟信号。目前我们还有一个细节没有完全打通那就是这三者之间是如何协同工作的地址来了数据也来了时钟信号是如何配合让对应的数据或地址被外设准确拿到的3.2 存储单元的工作机制写入、读取与保持要理解数据如何被“拿住”我们必须深入到最微观的层面——存储单元。我们可以把一个存储单元想象成一个带开关的小盒子。写入当开关闭合时写端的数据比如1才能进入盒子内部。读取读端可以随时把盒子里的内容复制出去这个过程不会改变内部保存的值。保持这是最关键的功能。当开关断开后无论写端的数据怎么变哪怕变成了0盒子内部依然死死守住刚才写入的那个值比如1并且读端持续输出这个老值。这就是寄存器的物理基础。为了实现这种“保持”功能存储单元的写入端必须通过一个电子开关逻辑上类似与门来控制。这个开关的闭合与断开就是由我们常说的使能信号通常由时钟边沿触发来决定的。3.3 多位寄存器的构建并行锁存单个存储单元只能存 1 bit0 或 1但我们在编程时操作的都是 8 位、16 位或 32 位的数据。那么多位寄存器是怎么来的呢答案很简单并联。一个 8 位寄存器就是由 8 个独立的 1 位存储单元并联构成的。独立的写/读端每个单元都有自己独立的数据输入写端和输出读端分别对应数据的第 0 位到第 7 位。共享的使能端这 8 个单元的“开关控制线”是连在一起的都连接到同一个使能端。这意味着当我们想要写入一个 8 位数据例如二进制0010 0100时这 8 个单元的写端会同时接收到对应的高低电平。但是数据不会立刻进去它们在门口等着。只有当那个统一的使能信号比如时钟的上升沿到来时8 个开关同时闭合这 8 位数据才会被“咔嚓”一下同时锁存进寄存器内部。这就是为什么我们说寄存器配置本质上是在修计算器而且是在时钟的控制下进行的批量数据搬运。四、时钟信号与总线传输的协同机制4.1 朴素的数据传输模型摒弃掉所有复杂的电路细节我们可以建立一个非常朴素的认识模型左边是CPU右边是某个片上外设比如 GPIO。CPU 内部的一个寄存器里存着原始数据比如数字10。我们需要把这个10搬运到右边外设的寄存器里去。中间连接它们的是总线。在这个过程中CPU 把数据放到总线上同时把目标外设的地址放到地址总线上。这时候数据已经在总线上稳定输出了但外设还没拿到。为什么因为外设寄存器的“输入开关”还关着呢。4.2 时钟的核心作用同步控制的开关这时候时钟信号就登场了。时钟线和数据线、地址线之间是什么关系答案是时钟线让“放数据到总线”和“开启目标设备寄存器”这两个动作同步起来。具体来说当时钟信号比如上升沿到来时它起到了两个关键作用控制 CPU 侧让 CPU 把寄存器里的数据稳稳地放到数据总线上把地址放到地址总线上。控制外设侧通过片选逻辑打开目标外设寄存器的使能开关。一旦这个开关打开总线上的数据就顺着通路流进了外设的寄存器。如果没有时钟的统一调度数据可能在总线上乱跑或者外设还没准备好数据就丢了。4.3 关于“同步”的深度理解这里提到的“同步”并不是指所有事情必须在同一纳秒内发生而是指步调是有规律的。确实存在分频的情况。比如系统可能先让 CPU 打开输出过了两个时钟周期后再让片上外设的时钟打开输入开关。这就有了速度差。但这依然是“同步”的因为它们都是基于同一个时钟源的节拍在运作无非是经过了几个时钟周期的延迟而已。无论是上升沿、下降沿还是高电平、低电平触发核心逻辑都是一样的时钟控制了数据传输的节奏。几乎所有片上外设SPI, I2C, UART 等的使能和配置原理它们都是一回事——都要在时钟的控制下统一进行。五、MCU 内部架构全景时钟树与总线的打通5.1 从时钟源到 Cortex-M3 内核现在我们将目光投向 MCU 的内部架构图看看刚才讲的理论是如何落地的。在 MCU 的最左侧是时钟树的源头。我们有内部高速时钟HSI(8MHz) 和外部高速时钟HSE(8MHz)。这些时钟信号经过/2分频器进入选择器。选择器输出的信号进入PLL 锁相环倍频器将频率倍频到系统所需的高频比如 72MHz。倍频后的信号再次经过选择器进入AHB 预分频器。最终AHB 预分频器输出了系统的主时钟HCLK。这个 HCLK 至关重要它直接连接到了中间的Cortex-M3内核为 CPU 的运行提供心跳。5.2 数据流动的完整路径请看架构图的中间部分这里展示了数据是如何从 CPU 流向片上外设的。Cortex-M3 内核侧CPU 内部有一个8 位寄存器由存储单元 A 到 H 组成。当 CPU 决定发送数据时它会把这个寄存器的值输出到中间的8 位数据总线上。注意这个输出动作是受 HCLK 控制的。总线传输数据总线就像一条高速公路连接着左边的 CPU 和右边的外设。图中紫色的箭头清晰地指示了写入方向从左向右。片上外设侧在架构图的右侧是具体的某个片上外设比如挂载在 APB1 总线上的设备。它也拥有一个8 位寄存器同样由存储单元 A 到 H 组成。这个外设的时钟来源是APB1由 HCLK 进一步分频得到。外设寄存器的使能端连接到了 APB1 时钟线上。外设寄存器的写端连接到了 8 位数据总线上。5.3 一次完整的写操作复盘当 CPU 想要配置这个外设时CPU 在 HCLK 的驱动下将配置数据比如0x55放到 8 位数据总线上。同时地址总线选中了这个外设。APB1 时钟信号产生一个上升沿。这个上升沿传导到右侧外设寄存器的使能端。外设内部那 8 个存储单元的开关瞬间闭合。数据总线上的0x55被锁存进外设的寄存器中。上升沿结束开关断开数据被永久保持直到下一次写入。至此就深刻理解 ARM CPU 和 GPIO 等片上外设的数据是如何通过总线导通的以及时钟在其中扮演的“统一指挥官”角色。结语

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价