目录
一、初识RCC
1.功能
2.作用
二、时钟设置事例
1. HSE高速外部时钟信号
2. PLL时钟源
3. PLL时钟
4. 系统时钟SYSCLK
5. AHB总线时钟HCLK
6. APB2总线时钟HCLK2
7. APB1总线时钟HCLK1
三、其他时钟
1. USB时钟
2. Cortex系统时钟
3. ADC时钟
4. RTC时钟、独立看门狗时钟RTC时钟
5. MCO时钟输出
四、补充(HSE、HSI)
1.使用HSE
2.使用HSI
时钟是单片机运行的基础,只有有了时钟,单片机才能够运行执行指令,才能够做其他的处理(点灯,串口,ADC)。STM32外设非常多,但实际使用的时候只会用到有限的几个,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费,并且,同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。所以便有了STM32的时钟系统和时钟树。
(1)设置系统时钟SYSCLK。
(2)设置AHB分频因子(决定HCLK等于多少)。
(3)设置APB2分频因子(决定PCLK2等于多少)。
(4)设置APB1分频因子(决定PCLK1等于多少)。
(5)设置各个外设的分频因子。
(6)控制AHB、APB2和APB1这3条总线时钟的开启。
(7)控制每个外设的时钟的开启。
SYSCLK、 HCLK、 PCLK2、PCLK1这4个时钟的配置一般是:PCLK2=HCLK=SYSCLK=PLLCLK=72MHz,PCLK1=HCLK/2=36MHz
这个时钟配置也是库函数的标准配置,用得最多。
利用HSE把时钟设置为:PCLK2=HCLK=SYSCLK=72MHz,PCLK1=HCLK/2=36MHz。
HSE是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率为4~16MHz。当使用有源晶振时,时钟从OSC_IN引脚进入,OSC_OUT引脚悬空;当使用无源晶振时,时钟从OSC_IN和OSC_OUT进入,并且要配谐振电容。
HSE最常使用的就是8MHz的无源晶振。当确定PLL时钟来源的时候,HSE可以不分频或者2分频,这个由时钟配置寄存器CFGR的位17,即PLLXTPRE设置。这里设置为HSE不分频。
PLL时钟来源可以有两个:一个是HSE,另外一个是HSI/2。具体用哪个由时钟配置寄存器CFGR的位16,即PLLSRC设置。HSI是内部高速的时钟信号,频率为8MHz,根据温度和环境的情况频率会漂移,一般不作为PLL的时钟来源。这里我们选HSE作为PLL的时钟来源。
PLLCLK通过设置PLL的倍频因子,可以对PLL的时钟来源进行倍频,倍频因子可以是2~16,具体设置成多少,由时钟配置寄存器CFGR的位21~18,即PLLMUL[3:0]设置。这里设置为9倍频。
因为上一步设置PLL的时钟来源为HSE=8MHz,所以经过PLL倍频之后的PLL时钟为:PLLCLK=8Mx9=72MHz。72MHz是ST官方推荐的稳定运行时钟,如果想超频的话,增大倍频因子即可,最高为128MHz。这里设置PLL时钟:PLLCLK=8Mx9=72MHz。
系统时钟的来源可以是HSI、PLLCLK、HSE,具体由时钟配置寄存器CFGR的位1~0, 即SW[1:0]设置。这里设置系统时钟:SYSCLK=PLLCLK=72MHz。
系统时钟SYSCLK经过AHB预分频器分频之后得到的时钟叫APB总线时钟,即HCLK,分频因子可以是[ 1,2,4,8,16,64,128,256,512 ],具体由时钟配置寄存器CFGR的位7~4,即HPRE[3:0]设置。片上大部分外设的时钟都是经过HCLK分频得到的,至于AHB总线上的外设的时钟设置为多少,等到使用该外设的时候才设置,这里只需粗略设置好APB的时钟即可,设置为1分频,即HCLK=SYSCLK=72MHz。
由HCLK经过高速APB2预分频器得到,分频因子可以是[ 1,2,4,8,16 ],具体由时钟配置寄存器CFGR的位13~11,即PPRE2[2:0]决定。HCLK2属于高速的总线时钟,片上高速的外设就挂载到这条总线上( 全部的GP1O、USART1、 SPI1等 )。至于APB2总线上的外设的时钟设置为多少,得等到使用该外设的时候才设置,这里只需粗略设置好APB2的时钟即可,设置为1分频,即PCLK2=HCLK=72MHz。
由HCLK经过低速APB1预分频器得到,分频因子可以是[ 1,2,4,8,16 ],具体由时钟配置寄存器CFGR的位10~8,即PRRE1[2:0]决定。HCLK1属于低速的总线时钟,最高为36MHz,片上低速的外设就挂载到这条总线上( USART2/3/4/5、SPI2/3等 )。至于APB1总线上外设的时钟设置,得等到使用该外设的时候才进行,这里只需粗略设置好APB1的时钟即可,设置为2分频,即PCLK1=HCLK/2=36MHz。
由PLLCLK经过USB预分频器得到的,分频因子可以是1或1.5,具体由时钟配置寄存器CFGR的位22,即USBPRE配置。USB的时钟最高是48MHz,根据分频因子反推过来算,PLLCLK只能是48MHz或者72MHz。一般设置PLLCLK=72MHz,USBCLK=48MHz。USB对时钟要求比较高,所以PLLCLK只能是由HSE倍频得到,不能使用HSI倍频。
由HCLK选8分频得到,等于9MHz,Cortex系统时钟用来驱动内核的系统定时器SysTick, SysTick一般用于操作系统的时钟节拍,也可以用作普通的定时。
由PCLK2经过ADC预分频器得到,分频因子可以是[ 2,4,6,8],具体由时钟配置寄存器CFGR的位15~14,即ADCPRE[1:0]决定。ADC时钟最高只能是14MHz,如果采样周期设置成最短的1.5个周期的话,ADC的转换时间可以达到最短的1s。如果真要达到最短的转换时间1s的话,那么ADC的时钟就得是14MHz,反推PCLK2的时钟只能是28MHz、56MHz、84MHz、 112MHz。因为PCLK2最高是72MHz,所以只能取28MHz和56MHz。
可由HSE/128分频得到,也可由低速外部时钟信号LSE提供,频率为32.768kHz,也可由低速内部时钟信号HSI提供,具体选用哪个时钟,由备份域控制寄存器BDCR的位9~8,即RTCSEL[1:0]配置。独立看门狗的时钟只能由LSI提供,LSI是低速的内部时钟信号,频率为30~60kHz,一般取40kHz。
MCO( Microcontroller Clock Output )是微控制器时钟输出引脚,在STM32F1系列中由PA8复用所得,主要作用是对外提供时钟,相当于一个有源晶振。MCO的时钟来源可以是:PLLCLK/2、 HSI、 HSE、 SYSCLK,具体选哪个由时钟配置寄存器CFGR的位26~24,即MCO[2:0]决定。【 除了对外提供时钟这个作用之外,还可以通过示波器监控MCO引脚的时钟输出来验证系统时钟配置是否正确 】
一般情况下,都是使用HSE,然后将HSE经过PLL倍频之后作为系统时钟。通常的配置是:HSE=8MHz,PLL的倍频因子为9,系统时钟就设置成SYSCLK=8Mx9=72MHz。
在使用的库函数时,程序来到main函数之前,启动文件statup_stm32f10x_hd.s已经调用System_Init函数,把系统时钟初始化成72MHz,System_Init在库文件system_stm32f10x.c中定义。如果想把系统时钟设置低一点或者超频的话,可以修改底层的库文件。但是为了维持库的完整性,可以根据时钟树的流程自行写一个。
如果PLL的时钟来源是HSE,那么当HSE故障的时候,不仅HSE不能使用,连PLL也会被关闭,这个时候系统会自动切换HSI作为系统时钟。此时SYSCLK=HSI=8MHz,如果没有开启CSS和CSS中断的话,那么整个系统就只能在低速率运行,这时系统跟瘫痪没什么两样。
如果开启了CSS功能的话,那么当HSE故障时,可以在CSS中断里面采取补救措施,使用HSI,并把系统时钟设置为更高的频率,最高是64MHz,其足够一般的外设使用。但是原来SYSCLK=72MHz,现在因为故障改成64MHz,那么那些外设的时钟肯定被改变了,外设工作就会被打乱。是否需要在设置HSI时钟的时候,重新调整外设总线的分频因子,即AHB、APB2和APB1的分频因子,使外设的时钟达到跟HSE没有故障之前一样。但是这个也不是最保险的办法,毕竟不能一直使用HSI,所以当HSE出故障时还是要采取报警措施。