认识时钟树
1、什么是时钟?
时钟是单片机的脉搏,是系统工作的同步节拍。单片机上至CPU,下至总线外设,它们工作时序的配合,都需要一个同步的时钟信号来统一指挥。时钟信号是周期性的脉冲信号,一般为占空比为50%的方波。
2、STM32为什么会有时钟树?
STM32是一种复杂的单片机,总线上挂载的外设非常多,这些外设工作速度有快有慢,所需要的时钟信号也不一样,STM32没有办法对这些时钟进行统一供应。因此考虑先将时钟信号倍频后,再通过分频器将高频时钟分成各种不同频率的时钟信号供给不同的设备使用。时钟信号的分频就像树的分支一样,时钟树就产生了。
3、STM32时钟系统
1>时钟系统介绍
以STM32F103系列为例,STM32有四个时钟源可供选择使用,分别为:
外部高频振荡器(HSE) | 频率4~16MHz |
内部高频振荡器(HSI) | 频率8MHz |
外部低频振荡器(LSE) | 频率32.768KHz |
内部低频振荡器(LSI) | 频率40KHz |
STM32的时钟树结构如图所示:
STM32中的核心和众多外设时钟都是由高速时钟先倍频再分频得到的。在高速时钟系统中,STM32可接4-16MHz的外部高速振荡器作为时钟,经过1分频或者2分频进入锁相环PLL,也可以不经过PLL直接作为系统时钟SYSCLK的输入;STM32的内部高速震荡电路可提供频率为8MHz的时钟信号,经过2分频进入PLL,或者不经过PLL直接作为系统时钟的输入。需要注意的是,当使用HSE作为时钟信号时,时钟信号经过分频和PLL倍频后,输出给SYSCLK的时钟最大不超过72MHz,否则会使得系统时钟超频;对于HIS,当其接入锁相环PLL时,其能提供给系统时钟的最大频率为8MHz/2*16=64MHz。
系统时钟SYSCLK进入预分频器AHB,分频后供给AHB挂载外设、Cortex内核、APB1总线、APB2总线使用。APB1、APB2总线上挂载的外设再由APB1、APB2总线上的时钟继续向下分频得到,其中APB1总线可提供的最高频率为36MHz,APB2总线可提供的最高频率为72MHz。至于APB1、APB2总线上究竟挂载哪些外设,这个具体要看芯片手册的系统结构介绍,如下图。
系统低速时钟的LSI,主要供给看门狗时钟IWDG和实时时钟电路RTC;HIS主要供给实时时钟电路RTC。
这时,再看芯片手册就容易理解很多了,其中图中的梯形表示选择关系,梯形的底边为输入,顶部为输出,梯形的斜边引出的线为选择逻辑,控制这条线的状态即可控制选择哪条输入作为输出。
2>一个时钟分支走向的例子
譬如我们看一个例子:HSE接入8MHz的外部震荡信号,由PLLXTPER进行选择进行1分频还是2分频,假如是1分频,则8MHz的时钟信号来到了PLLSRC控制选择的位置,配置PLLSRC,选择进入PLL锁相环的时钟信号源,假设来自HSE的信号选通,则8MHz的信号来到锁相环中,配置PLLMUL,可以选择倍频系数,假设倍频系数选为9,则PLL输出72MHz的时钟信号,SYSCLK前面的梯形的选择逻辑控制着SYSCLK时钟信号来自于3个接入信号HSE、HIS、PLLCLK中的哪一个,通过SW和CSS控制,选择PLLCLK后,系统就可以获得72MHz的时钟频率了。这个CSS是时钟安全保护系统,主要是在HSE出现故障时发生NMI中断,具体要看手册59页信息介绍。
为了减少功耗,STM32上外设的时钟初始状态默认为关闭,如需使用外设,则必须开启外设时钟。譬如我们现在要使用外设GPIOB,则系统时钟SYSCLK要通过预分频器AHB分频,再进入APB2总线进行再分频(GPIOB是挂载在APB2总线上的外设),时钟信号的输入和外设时钟使能位接在一个与门上,当要使用外设时,需要将这个使能位置1,配置完成之后,GPIOB方可正常工作。