欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32时钟配置函数详解

程序员文章站 2022-06-09 08:28:19
...

STM32时钟配置函数详解

一:STM32F1时钟树图
STM32时钟配置函数详解
上图从左往右看,就是整个 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时钟配置函数详解

STM32时钟配置函数详解
二:Stm32_Clock_Init函数详解
首先是两个关键的寄存器:
STM32时钟配置函数详解STM32时钟配置函数详解相关语句讲解:

MYRCC_DeInit();	

该函数实现外设的复位,并关断所有中断,同时调用向量表配置函数MY_NVIC_SetVectorTable,配置中断向量表

RCC->CR|=0x00010000; 

将CR寄存器第16位置1,即开启外部高速时钟HSE:
STM32时钟配置函数详解

while(!(RCC->CR>>17))

外部振荡器开启后,需要一段时间稳定下来,当CR寄存器第17位为1时,表明外部振荡器已经稳定
STM32时钟配置函数详解

RCC->CFGR=0X00000400; 

将CFGR寄存器第7:4位置0,10:8位置为100,第13:11位置为0,即设置APB1的分频系数为2,APB2的分频系数为1,HB的分频系数为1
STM32时钟配置函数详解

STM32时钟配置函数详解

PLL-=2;
RCC->CFGR|=PLL<<18;  

观察CFGR的第21:18位可以看出其相应的位的值位倍频值减去2,所以该步骤为设置PLL的倍频系数,当PLL为9时,系统时钟频率为8*9=72MHz
STM32时钟配置函数详解

RCC->CFGR|=1<<16;

HSE时钟作为PLL输入时钟。
STM32时钟配置函数详解

RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));

STM32时钟配置函数详解打开PLL并且等待就绪

RCC->CFGR|=0x00000002;

选择PLL作为系统时钟输入
STM32时钟配置函数详解


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》

相关标签: STM32 时钟