STM32时钟系统
从时钟频率来说,分为高速时钟和低速时钟,高速时钟是提供给芯片主体的主时钟,而低速时钟只是提供给芯片中的 RTC(实时时钟)及独立看门狗使用。
从芯片角度来说,时钟源又分为内部时钟与外部时钟源 ,内部时钟是在芯片内部 RC 振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号。所以,STM32 有以下 4 个时钟源:
高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用 8MHz 的晶振。
高速内部时钟(HSI): 由内部 RC 振荡器产生,频率为 8MHz,但不稳定。
低速外部时钟(LSE):以外部晶振作时钟源,主要提供给实时时钟模块,所以一般采用 32.768KHz。实验板上用的是 32.768KHz,6p 负载规格的晶振。
低速内部时钟(LSI):由内部 RC 振荡器产生,也主要提供给实时时钟模块,频率大约为 40KHz。
这个图说明了 STM32 的时钟走向,从图的左边开始,从时钟源一步步分配到外设时钟。
高速外部时钟(HSE)
我们以最常用的高速外部时钟为例分析,首先假定我们在外部提供的晶振的频率为 8MHz 的。
1、 从左端的 OSC_OUT 和 OSC_IN 开始,这两个引脚分别接到外部晶振的两端。
2、 8MHz 的时钟遇到了第一个分频器 PLLXTPRE(HSE divider for PLLentry),在这个分频器中,可以通过寄存器配置,选择它的输出。它的输出时钟可以是对输入时钟的二分频或不分频。本例子中,我们选择不分频,所以经过 PLLXTPRE 后,还是 8MHz 的时钟。
3、 8MHz 的时钟遇到开关 PLLSRC(PLL entry clock source),我们可以选择其输出,输出为外部高速时钟(HSE)或是内部高速时钟(HSI)。这里选择输出为 HSE,接着遇到锁相环 PLL,具有倍频作用,在这里我们可以输入倍频因子 PLLMUL(PLL multiplicationfactor),哥们,你要是想超频,就得在这个寄存器上做手脚啦。经过PLL 的时钟称为 PLLCLK。倍频因子我们设定为 9 倍频,也就是说,经过 PLL 之后,我们的时钟从原来 8MHz 的 HSE 变为 72MHz 的 PLLCLK
4、 紧接着又遇到了一个开关 SW,经过这个开关之后就是 STM32 的系统时钟(SYSCLK)了。通过这个开关,可以切换 SYSCLK 的时钟源,可以选择为 HSI、PLLCLK、HSE。我们选择为 PLLCLK 时钟,所以 SYSCLK 就为 72MHz 了。
5、 PLLCLK 在输入到 SW 前,还流向了 USB 预分频器,这个分频器输出为USB 外设的时钟(USBCLK)。
6、 回到 SYSCLK,SYSCLK 经过 AHB 预分频器,分频后再输入到其它外设。如输出到称为 HCLK、FCLK 的时钟,还直接输出到 SDIO 外设的SDIOCLK 时钟、存储器控制器 FSMC 的 FSMCCLK 时钟,和作为 APB1、APB2 的预分频器的输入端。本例子设置 AHB 预分频器不分频,即输出的频率为 72MHz。
7、 GPIO 外设是挂载在 APB2 总线上的, APB2 的时钟是 APB2 预分频器的输出,而 APB2 预分频器的时钟来源是 AHB 预分频器。因此,把APB2 预分频器设置为不分频,那么我们就可以得到 GPIO 外设的时钟也等于 HCLK,为 72MHz 了。
HCLK、FCLK、PCLK1、PCLK2
从时钟树的分析,看到经过一系列的倍频、分频后得到了几个与我们开发密切相关的时钟。
SYSCLK:系统时钟,STM32 大部分器件的时钟来源。主要由 AHB 预分频器分配到各个部件。
HCLK:由 AHB 预分频器直接输出得到,它是高速总线 AHB 的时钟信号,提供给存储器,DMA 及 cortex 内核,是 cortex 内核运行的时钟,cpu 主频就是这个信号,它的大小与 STM32 运算速度,数据存取速度密切相关。
FCLK:同样由 AHB 预分频器输出得到,是内核的“自由运行时钟”。“自由”表现在它不来自时钟 HCLK,因此在 HCLK 时钟停止时 FCLK 也继续运行。它的存在,可以保证在处理器休眠时,也能够采样和到中断和跟踪休眠事件 ,它与 HCLK 互相同步。
PCLK1:外设时钟,由 APB1 预分频器输出得到,最大频率为 36MHz,提供给挂载在 APB1 总线上的外设。
PCLK2:外设时钟,由 APB2 预分频器输出得到,最大频率可为72MHz,提供给挂载在 APB2 总线上的外设。
为什么 STM32 的时钟系统如此复杂,有倍频、分频及一系列的外设时钟的开关。需要倍频是考虑到电磁兼容性,如外部直接提供一个 72MHz 的晶振,太高的振荡频率可能会给制作电路板带来一定的难度。分频是因为 STM32 既有高速外设又有低速外设,各种外设的工作频率不尽相同,如同 pc 机上的南北桥,把高速的和低速的设备分开来管理。最后,每个外设都配备了外设时钟的开关,当我们不使用某个外设时,可以把这个外设时钟关闭,从而降低 STM32的整体功耗。所以,当我们使用外设时,一定要记得开启外设的时钟