时钟树简介
在STM32芯片内部,有很多片上外设,每个片上外设负责执行一定的功能。而片上外设本质是时序电路,让其工作必须提供时钟,且不同片上外设所需时钟频率不同。
因此需要再STM32芯片内部去产生各种频率的时钟信号,并且最终把这些时钟信号分配给每一个片上外设。此功能通过时钟系统(时钟树)来完成,如下图所示:
将时钟系统画成一棵树来表示,以大树为例:在树根的位置(HSL、HSE)是时钟的来源,然后通过一些复杂的电路对时钟进行一些运算(倍频、分频)和加工,得到三个不同的频率信号,分配给三路片上外设。
由上图可知,对于STM32芯片内部大部分片上外设都是通过大树获取时钟,而右边的小树只给两个模块(RTC实时时钟、IWDG看门狗)去提供时钟。
计数器与分频
我们通过计数器来实现分频,对于计数器,它由三部分组成:2个寄存器,1个比较器。
对于寄存器来说,一个用于设置计数器的计数周期,另一个用于记录当前的计数值(从0开始计数,晶振每来一个脉冲,数值就加一,直到与计数周期相等,再重新置0);当计数周期与计数值相等时,比较器向外输出一个脉冲,从而实现分频的作用。
我们可以设置计数周期来设置分频系数,假设计数周期是N,则分频系数便为N+1;
HSI、HSE、LSI、LSE
对于HSI、HSE、LSI、LSE,是芯片的时钟(脉冲信号)的来源,含义如下表格所示:
内 | 外 | |
低 | LSI (Low Speed Internal) | LSE (Low Speed External) |
高 | HSI (High Speed Internal) | HSE (High Speed External) |
其中LSI、HSI位于芯片内部,其频率固定;而LSE、HSE位于芯片外部,需要外接(晶振),通常规定HSE为4~16MHz、LSE与LSI相同,为32.768KHz;
我们既可以使用内部时钟源来提供时钟,也可以使用外部时钟源。但相比较而言,外部时钟源精度更为准确。需要精准定时的话,必须使用外部时钟源,即晶振。
系统时钟来源
系统时钟SYSCLK有三种来源,如下图所示:
注意,SYSLCK最大频率为72MHz;
对于从锁相环PLL而言,其倍频系数为2~16。
总线时钟的产生
对于总线时钟:PCLK1、PCLK2、HCLK而言,都是由系统时钟SYSCLK经过逐级分频得到的。对于AHB、APB1、APB2分频器,其分频系数可通过编程控制,具体如下:
需要注意,对于HCLK、PCLK2来说,所允许的最高频率为72MHz; 对于PCLK1来说,所允许最高频率为36MHz。
时钟树的初始状态:
1、SYSCLK=HSI
2、分频器系数都是1;
3、SYSCLK、HCLK、PCLK1、PCLK2都为8MHz;
4、大部分片上外设的时钟处于关闭状态;
注意,在使用标准库编程时,时钟树初始状态并非如上所述。因为在执行main函数之前,会先执行启动文件里的Reset_Handler函数,该函数中包含了SystemInit函数,会将各时钟配置成最高频率。
可在启动文件大概130行处找到对应函数,将里面的SystemInit函数注释掉。
RCC简介
RCC:Reset and Clock Control,即复位和时钟控制,是STM32的片上外设之一,负责控制芯片的复位以及对时钟树进行配置。