STM32时钟配置函数详解
STM32时钟配置函数详解
一:STM32F1时钟树图
上图从左往右看,就是整个 STM32 的时钟走向。这里,我们挑选出 4 个重要的地方进行
介绍(图 5.2.2.1 中标出的 1~4)。
1、 PLL
PLL 用于设置 STM32 的 PLLCLK,STM32 支持 2~16 倍频设置。我们常用的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。从上图可以看出,PLLMUL 的时钟源,可以来自内部(HSI) 8M RC 振荡/2 或者外部(HSE)高速晶振(4~16Mhz)。这里切记PLLMUL设置后的频率不要超过72Mhz
2、 SW(开关)
SW 是 STM32 的 SYSCLK(系统时钟)切换开关,从上图可以看出,SYSCLK 的来源可以是3个:HSI、PLLCLK和HSE。我们一般选择PLLCLK作为SYSCLK。SYSCLK最大为 72M。这里提示一下大家:STM32 刚上电的时候,用的是系统内部 8M RC 时钟,之后运行程序才会把时钟源设置为其他。
3、 PCLK1
PCLK1 是 APB1 总线上外设的时钟,最大为 36Mhz,所有挂载在 APB1 上的外设,最大时钟都是 36Mhz,比如串口 2~5、SPI2 和 SPI3 等,
在使用的时候,要特别留意。PCLK1 的时钟可以通过 APB1 预分频器设置,我们默认一般设置为 2 分频。
4、 PCLK2
PCLK2 是 APB2 总线上外设的时钟,最大为 72Mhz,所有挂载在 APB2 上的外设,最大时钟都是 72Mhz,比如 GPIOA~G、串口 1、SPI1、ADC1~3 等。 PCLK2 的时钟可以通过 APB2 预分频器设置,我们默认一般设置为 1,也就是不分频。
5、 系统滴答时钟(SYSTICK)(没有画出)
SYSTICK 就是 CortexM3 的系统滴答时钟,SYSTICKAHB 分频后再 8 分频,因为我们一般设置 AHB 不分频,所以 SYSTICK 的频率就等于SYSCLK/8,如果 SYSCLK 为 72M,那么 SYSTICK 的频率就是 9Mhz。延时函数,就是基于 SYSTICK 来实现的。
总结:
二:Stm32_Clock_Init函数详解
首先是两个关键的寄存器:
相关语句讲解:
MYRCC_DeInit();
该函数实现外设的复位,并关断所有中断,同时调用向量表配置函数MY_NVIC_SetVectorTable,配置中断向量表
RCC->CR|=0x00010000;
将CR寄存器第16位置1,即开启外部高速时钟HSE:
while(!(RCC->CR>>17))
外部振荡器开启后,需要一段时间稳定下来,当CR寄存器第17位为1时,表明外部振荡器已经稳定
RCC->CFGR=0X00000400;
将CFGR寄存器第7:4位置0,10:8位置为100,第13:11位置为0,即设置APB1的分频系数为2,APB2的分频系数为1,HB的分频系数为1
PLL-=2;
RCC->CFGR|=PLL<<18;
观察CFGR的第21:18位可以看出其相应的位的值位倍频值减去2,所以该步骤为设置PLL的倍频系数,当PLL为9时,系统时钟频率为8*9=72MHz
RCC->CFGR|=1<<16;
HSE时钟作为PLL输入时钟。
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25));
打开PLL并且等待就绪
RCC->CFGR|=0x00000002;
选择PLL作为系统时钟输入
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
MYRCC_DeInit(); //复位并配置向量表
RCC->CR|=0x00010000; //外部高速时钟使能 HSEON
while(!(RCC->CR>>17)); //等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2; //抵消 2 个单位
RCC->CFGR|=PLL<<18; //设置 PLL 值 2~16
RCC->CFGR|=1<<16; //PLLSRC ON
FLASH->ACR|=0x32; //FLASH 2 个延时周期
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25)); //等待 PLL 锁定
RCC->CFGR|=0x00000002; //PLL 作为系统时钟
while(temp!=0x02) //等待 PLL 作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
调用
Stm32_Clock_Init(9);
参考:《STM32中文参考手册_V10》
《STM32不完全手册_寄存器版本_V3.1》