STM32时钟配置(超频配置)方法

时钟

三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟
在这里插入图片描述

具体的系统时钟配置方法及步骤:

编程要点
编程要点对应着时钟树图中的序号。
1、开启 HSE/HSI ,并等待 HSE/HSI 稳定
2、设置 AHB、APB2、APB1的预分频因子
3、设置 PLL的时钟来源,和 PLL的倍频因子,设置各种频率主要就是在这里设置
4、开启 PLL,并等待 PLL稳定
5、把 PLLCK切换为系统时钟 SYSCLK
6、读取时钟切换状态位,确保 PLLCLK被选为系统时钟

一、使用HSE配置系统时钟
一般情况下,我们都是使用 HSE,然后 HSE 经过 PLL 倍频之后作为系统时钟。通常 的配置是:HSE=8M,PLL的倍频因子为:9,系统时钟就设置成:SYSCLK = 8M * 9 = 72M。 使用 HSE,系统时钟 SYSCLK最高是 128M。我们使用的库函数就是这么干的, 当程序来 到 main 函数之前,启动文件:statup_stm32f10x_hd.s 已经调用 SystemInit()函数把系统时钟 初始化成 72MHZ,SystemInit()在库文件:system_stm32f10x.c 中定义。如果我们想把系统 时钟设置低一点或者超频的话,可以修改底层的库文件,但是为了维持库的完整性,我们 可以根据时钟树的流程自行写一个。

void  HSE_SetSysClk(uint32_t RCC_PLLMul_x)
{
		ErrorStatus HSEStatus;
	
	//把之前已经配置好的rcc寄存器复位成复位值
	RCC_DeInit();
	
	//使能HSE
	RCC_HSEConfig(RCC_HSE_ON);
	
	HSEStatus=RCC_WaitForHSEStartUp();
	
	if(HSEStatus==SUCCESS)
 {
		//使能预取指
	 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
	 FLASH_SetLatency(FLASH_Latency_2);
	 
	//配置总线时钟 
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div2);
  RCC_PCLK2Config(RCC_HCLK_Div1);
	
   //配置PLLCLK=HSE*RCC_PLLMul_x	 
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_x );

	 //使能PLL
  RCC_PLLCmd(ENABLE);
	 
	 //等待PLL稳定
	 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
	 
	 //选择PLL作为系统时钟来源
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
	 
	//等待系统时钟是否选择完毕 
  while(RCC_GetSYSCLKSource()!=0x08);
 }
 else
 {
	 /*如果HSE启动失败,用户可以在这里添加处理错误的代码*/
 }
	
}

这个函数采用库函数编写, 函数有个形参 RCC_PLLMul_x,RCC_PLLMul_x用来设置 PLL 的倍频因子, 在调用的时候形参可以是:RCC_PLLMul_x , x:[2,3,…16],这些宏来源于库函数的定义,宏 展开是一些 32 位的十六进制数,具体功能是配置了时钟配置寄存器 CFGR 的位 21-18 PLLMUL[3:0],预先定义好倍频因子,方便调用。
函数调用举例:HSE_SetSysClock(RCC_PLLMul_9); 则设置系统时钟为:8MHZ * 9 = 72MHZ。 HSE_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:8MHZ * 16 = 128MHZ 超频慎用

二、使用HSI配置系统时钟

void  HSI_SetSysClk(uint32_t RCC_PLLMul_x)
{
  uint32_t HSIStatus=0;
	
	//把之前已经配置好的rcc寄存器复位成复位值
	RCC_DeInit();
	
	//使能HSI
	RCC_HSICmd(ENABLE);
	//等待 HSI 就绪  直接操作寄存器
	HSIStatus=RCC->CR & RCC_CR_HSIRDY;
	
	if(HSIStatus==RCC_CR_HSIRDY)
 {
		//使能预取指
	 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
	 FLASH_SetLatency(FLASH_Latency_2);
	 
	 //配置总线时钟
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div2);
  RCC_PCLK2Config(RCC_HCLK_Div1);
	
   //配置PLLCLK=HSE*RCC_PLLMul_x	 
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2 ,RCC_PLLMul_x );

	 //使能PLL
  RCC_PLLCmd(ENABLE);
	 
	 //等待PLL稳定
	 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
	 
	 //选择PLL为系统时钟
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
	 
	//等待系统时钟是否选择完毕 
  while(RCC_GetSYSCLKSource()!=0x08);
 }
 else
 {
	 /*如果HSI启动失败,用户可以在这里添加处理错误的代码*/
 }
	
}

HSI 设置系统时钟函数跟 HSE 设置系统时钟函数在原理上是一样的,有一个区别的地 方就是,HSI 必须 2 分频之后才能作为 PLL 的时钟来源,所以使用 HSI 时,最大的系统时 钟 SYSCLK只能是 HSI/216=416=64MHZ。
函数调用举例:HSI_SetSysClock(RCC_PLLMul_9); 则设置系统时钟为:4MHZ * 9 = 36MHZ。

注:以上内容参考自野火零死角玩转stm32

你可能感兴趣的:(STM32时钟配置(超频配置)方法)