STM32 的时钟树
对于广大初次接触 STM32 的读者朋友(甚至是初次接触 ARM 器件的读者朋友)来说,
在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟
树。
众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由
一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种
时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时
钟树”。在一些传统的低端 8 位单片机诸如 51,AVR,PIC 等单片机,其也具备自身的一个时
钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某
种不可更改的状态(假设单片机处于正常工作的状态)。比如 51 单片机使用典型的 12MHz
晶振作为时钟源,则外设如 IO 口、定时器、串口等设备的驱动时钟速率便已经是固定的,
用户无法将此时钟速率更改,除非更换晶振。
而 STM32 微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速
率不再有固定的关系,本文将来详细解析 STM32 微控制器的时钟树。图 1 是 STM32 微控制
器的时钟树,表 1 是图中各个标号所表示的部件。
表 1 图 1 标号释义
标号
释义
○
1
内部低速振荡器(LSI,40Khz)
○
2
外部低速振荡器(LSE,32.768Khz)
○
3
外部高速振荡器(HSE,3-25MHz)
○
4
内部高速振荡器(HIS,8MHz)
○
5
PLL 输入选择位
○
6
RTC 时钟选择位
○
7
PLL1 分频数寄存器
○
8
PLL1 倍频寄存器
○
9
系统时钟选择位
○
10
USB 分频寄存器
○
11
AHB 分频寄存器
○
12
APB1 分频寄存器
○
13
AHB 总线
○
14
APB1 外设总线
○
15
APB2 分频寄存器
○
16
APB2 外设总线
○
17
ADC 预分频寄存器
○
18
ADC 外设
○
19
PLL2 分频数寄存器
○
20
PLL2 倍频寄存器
○
21
PLL 时钟源选择寄存器
○
22
独立看门狗设备
○
23
RTC 设备