STM32----时钟配置

1.时钟树

STM32内部有5个时钟源:HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选为2~16倍,但是其输出频率最大不得超过72MHz。


首先文件执行时,先执行Systemlnit()函数进行系统时钟配置才执行main()函数。

SystemInit()后时钟频率大小:
SYSCLK(系统时钟) =72MHz
AHB 总线时钟(HCLK=SYSCLK) =72MHz
APB1 总线时钟(PCLK1=SYSCLK/2) =36MHz
APB2 总线时钟(PCLK2=SYSCLK/1) =72MHz
PLL 主时钟 =72MHz


2.时钟配置函数介绍
通常函数名里有Cmd是使能函数,Config是配置函数,Get是获取的函数

(1)时钟使能配置函数:

  • RCC_HSICmd
  • RCC_LSICmd
  • RCC_PLLCmd
  • RCC_RTCCLKCmd
  • RCC_AHBPeriphClockCmd
  • RCC_APBxPeriphClockCmd

RTC,AHB,APB是外设总线

(2)时钟源和分频因子相关配置函数:

  • RCC_HSEConfig
  • RCC_LSEConfig
  • RCC_PLLConfig
  • RCC_MCOConfig
  • RCC_SYSCLKConfig
  • RCC_HCLKConfig
  • RCC_PCLK1Config
  • RCC_PCLK2Config
  • RCC_RTCCLKConfig
  • RCC_ADCCLKConfig
  • RCC_USBCLKConfig

(3)外设复位函数:

  • RCC_APB1PeriphResetCmd
  • RCC_APB2PeriphResetCmd

(4)状态参数获取函数:

  • RCC_GetSYSCLKSource
  • RCC_GetClocksFreq
  • RCC_GetFlagStatus
  • RCC_ClearFlag

(5)RCC中断相关函数:

  • RCC_ITConfig
  • RCC_ClearITPendingBit
  • RCC_GetITStatus

3.系统时钟设置步骤

void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)div是系统时钟来源,pllm是PLL里的倍频系数
{
	RCC_DeInit(); //将外设RCC寄存器重设为缺省值(初始默认值)
	RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)
	
	if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振
	{
		RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)
		RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)
		RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)
		RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数
		RCC_PLLCmd(ENABLE); //使能或者失能PLL
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位设置与否,PLL就绪
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)
		while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
		
	}
}

我所用的stm32的系统时钟来源是PLL但PLL的来源是HSE,要改变系统时钟就改变HSE。

  • div有两个选项 RCC_PLLSource_HSE_Div1 (72Mhz), RCC_PLLSource_HSE_Div2(36Mhz)
  • pllm为倍频系数,2~16

01、将RCC寄存器重新设置为默认值 RCC_DeInit;
02、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);
03、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp();
04、设置AHB时钟 RCC_HCLKConfig;
05、设置高速AHB时钟(APB1) RCC_PCLK2Config;
06、设置低速速AHB时钟 (APB2) RCC_PCLK1Config;
07、设置PLL RCC_PLLConfig;
08、打开PLL RCC_PLLCmd(ENABLE);
09、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10、设置系统时钟 RCC_SYSCLKConfig;
11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)

猜你喜欢

转载自blog.csdn.net/weixin_43554366/article/details/86599448
今日推荐