时钟是单片机非常重要的一部分,它为单片机的系统或是外设提供了时序。这里主要来讲解一下stm32的时钟配置。
一、时钟树
要了解stm32的时钟结构,必须从时钟树开始。这是官方给出的RCC框图。
从图中可以看出,stm32的时钟信号来源有4个,外部高速时钟HSE,外部低速时钟LSE,内部高速时钟HSI,内部低速时钟LSI。一般情况下,选用HSE作为系统正常工作的时钟信号,HSE通常采用8MHz的无源晶振,因为它频率高且稳定,不容易发生温漂。
二、时钟介绍
PLL时钟源可以有两个:一个是HSE,另一个是HSI二分频,HSI是内部高速的时钟信号,频率为8MHz,根据温度和环境的情况会发生漂移,一般不作为PLL的时钟来源。这里直接选择HSE作为PLL的时钟来源。
1、PLLCLK
PLLCLK是PLL的时钟来源倍频之后的信号。倍频因子可以是2~16,如果选用8MHz的HSE,经9倍频之后就是72MHZ,这是官方推荐的稳定运行的时钟,如果想超频,可以增大倍频因子,但是超频会导致系统不稳定,所以一般情况下不建议超频。
1、系统时钟SYSCLK
系统时钟的来源可以是HSI,PLLCLK,HSE
2、AHB总线时钟HCLK
系统时钟SYSCLK经过AHB预分频器分频之后得到的时钟叫做HCLK,至于AHB总线上的外设的时钟设置为多少,得等到使用该外设的时候才设置。
3、APB2总线时钟PCLK2
APB2总线时钟PCLK2有HCLK经过高速APB2预分频器得到,PCLK2属于高速的总线时钟,片上高速的外设就挂载到这条总线上,如GPIO、USART1、SPI1等。
4、APB1总线时钟PCLK1
APB1总线时钟PCLK1由HCLK经过低速AHB预分频器得到,属于低速的总线时钟,最高为36MHZ。
还有一些其他的时钟,比如USB时钟,ADC时钟,RTC时钟等等,基本上是在前面的时钟的基础上经过分频得到,当需要使用的时候再进行配置,否则使用默认的即可。所以不多说,只要参考前面的时钟树就能了解清楚。
三、配置
接下来使用库函数对前面的内容进行配置。主要是完成对PLLCLK、SYSCLK、HCLK、PCLK2
、PCLK1的配置
void RCC_HSE_Config(u32 div,u32 pllm)//自定义系统时钟配置函数
{
RCC_DeInit();//设置为缺省值(即默认值)
RCC_HSEConfig(RCC_HSE_ON);//开启晶振
while(RCC_WaitForHSEStartUp()!=SUCCESS);//等待晶振起振
RCC_PLLConfig(div,pllm);//设置锁相环的时钟来源及倍频系数
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置HCLK的分频因子
RCC_PCLK1Config(RCC_HCLK_Div2);//设置PCLK1为二分频
RCC_PCLK2Config(RCC_HCLK_Div2);
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟来源
while(RCC_GetSYSCLKSource()!=0x08);//等待系统时钟设置完毕
}
调用这个函数即可实现对系统时钟的配置。其中第一个输入参数为锁相环的时钟来源(前面讲到可以有三个来源),第二个输入参数为锁相环的倍频系数。
总结:利用库函数可以比较方便的对系统时钟进行配置,主要是搞清楚各个模块它的时钟来源是什么,然后经过多少分频可以达到要求(同时注意不能超过它限定的频率)即可。如果要再对各个外设的时钟进行配置,那么首先要清楚各个外设是挂在哪条总线上的,再进行相应配置。