时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道 STM32 属于高级单片机,其内部有很多的外设,但不是所有外设都使用同一时钟频率工作,比如内部看门狗和 RTC,它只需 30 几 KHz 的时钟频率即可工作,所以内部时钟源就有多种选择。在前面章节的介绍中,我们知道 STM32系统复位后首先进入 SystemInit 函数进行时钟的设置,将 STM32F1 系统时钟设置为 72MHz(我们开发板上使用的 STM32F103ZET6 最大可达到 72M(超频除外)),然后进入主函数。那么这个系统时钟大小如何得来,其他外设的时钟又如何划分,这些问题都可以通过一张时钟树图找到答案,只要理解好时钟树,STM32 一切时钟的来龙去脉就会非常清楚。下面就来了解下时钟树,如下图所示,我们把时钟树拆分逐个介绍。

在 STM32 时钟系统中,有 5 个重要的时钟源,分别是 LSI、LSE、HSI、HSE、PLL。按照时钟频率分可分为高速时钟源和低速时钟源,在这 5 个中 HSI,HSE 以及 PLL 属于高速时钟,LSI 和 LSE 属于低速时钟。按照时钟来源可分为外部时钟源和内部时钟源,外部时钟源就是在 STM32 晶振管脚处接入外部晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他的是内部时钟源。下面我们就按照上图中数字顺序来介绍。

(1)图标 1 HSI 是内部高速时钟,RC 振荡器,频率为 8MHz。可作为系统时钟或 PLL 锁相环的输入。

(2)图标 2 HSE 是外部高速时钟,芯片的 23 和 24 引脚即为外部高速晶振管脚。可通过外接一个频率范围是 4-16MHz 的时钟或者晶振,我们开发板上接的是一个 8MHz 的外部晶振。HSE 可以作为系统时钟和 PLL 锁相环输入,还可以经过 128 分频后输入给 RTC。

(3)图标 3 LSI 是内部低速时钟,RC 振荡器,频率大约为 40K,可供独立看门狗和 RTC 使用,并且独立看门狗只能使用 LSI 时钟。

(4)图标 4 LSE 是外部低速时钟,我们开发板上 STM32 芯片的 PC14 和 PC15即为外部低速时钟管脚。通常在此管脚上外接一个 32.768KHz 的晶振,供 RTC使用。我们开发板上已经外接了一个 32.768K 的晶振。图标 5 PLL 是锁相环,用于倍频输出,因为开发板外部高速晶振也只有 8M,而我们这块芯片的最大时钟频率是 72M,因此可通过 PLL 锁相环来倍频。从图标5 中可以看到,PLL 时钟输入源可选择为 HSI/2、HSE 或者 HSE/2,时钟源经过 2-16倍频后输入给 PLLCLK,如果系统时钟选择由 PLLCLK 提供,则 PLLCLK 最大值不要超过 72M。