STM32时钟树
STM32时钟系统简介
在CPU中时钟系统就像人的心脏一样,给系统一个稳定的类似于人脉搏一样的一个工作时间基准,其重要性是不可言喻的。而STM32F4的时钟系统还是较为复杂的,不像51单片机一样一个系统时钟就可以担负整个系统的使用。那么STM32F4时钟系统较为复杂到底牵扯到了那些地方呢。STM32F4中是有很多外设的,并不一定所有外设都用同一个时钟,看门狗、RTC就只需要几十K的时钟就可以了,但是如果遇到速度要求比较高的呢,那么就需要有更高的时钟频率来解决了。更如果在一个系统中牵扯了很多的外设但是这些外设对时钟的要求又有不一呢。还有一个问题就是,在一个系统中,时钟越快其对应的功耗也就越大,相对应的系统抗干扰能力也就越弱,那么对于一个较为复杂的系统而言,采取多时钟源的方法则是较为合适的。
STM32时钟系统框图简介
为了更好地了解STM32时钟系统,将整个系统的时钟源,时钟流向都放在一个框图里面则就形成了时钟框图。如下图所示:
在STM32F411中一共有5个时钟源,分别是:LSI、LSE、HST、HSE、PLL。这五个是整个系统的时钟源。从高速和低速可以分为:LSE和LSI是低速时钟源,HSI、HSE、PLL是高速时钟源。从时钟来源看其中HSE和LSE是外部时钟源,其他的是内部时钟源。下面我们依次介绍一下以上五种时钟源:
-
LSI 是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用。
-
LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。 这个主要是 RTC 的时钟源。
-
HSI 是高速内部时钟,RC 振荡器,频率为16MHz。可以直接作为系统时钟或者用作 PLL输入。
-
HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~26MHz。我们的DragonFly学习平台接的是8M的晶振。HSE 也可以直接做为系统时钟或者 PLL 输入。
-
PLL 为锁相环倍频输出。 STM32F411有两个PLL:
- 主PLL是由HEI和HSE提供时钟信号,有两个输出时钟。
第一个输出PLLP用于产生高速时钟(最高为100MHz)。
第二个输出PLLQ用于USB OTG的时钟(48MHz)、随机数发生器的时钟和SDIO的时钟。
- 专用PLL(PLLI2S)用于实现高品质音频性能时输出精确时钟。
PLL锁相环内部参数配置
计算公式如下:
f(VOC时钟):PLL输出时经PPM分频和PPN倍频后的时钟。
f(PLL时钟输入):由HSI和HSE得到。
PLLN:VCO的主PLL的倍频系数。
PLLM:时钟分频系数。
f(PLL常规时钟输出):用于系统时钟选择,输出到系统时钟选择器。
PLLP:主系统时钟的主PLL分频系数。
PLLQ:主PLL分频系数,适用于USB OTG FS、SDIO
f(USB\SDIO时钟输出):用于USB OTG FS、SDIO等时钟
通过以上所述,我们可以配置输出我们所需要的时钟。在小马哥四轴学习平台中,使用的是100MHz,过程是将8M外部晶振经过倍频分频之后得出。下面以小马哥四轴案例来说明一下SYSCLK100MHz得出。
F(SYSCLK) = F(HSE)*PLLN/PLLM*PLLP = 8M*400/4*8 =100MHz
以上公式中,PLLN=400、PLLM=8、PLLP=4,经过PLL环输出的时钟就为100MHz。具体的参数参考范围可以参考《RM0383_STM32F411CCU6_Reference manual》第六章节的RCC_CFGR寄存器查看。
以上配置其实在STM32的标准库中都已经用函数封装好了,并且在启动文件里面自动调用。