32系统时钟配置

  时钟是STM32单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。(低功耗) 

   

  寄存器是由D触发器组成的,只有送来了时钟,触发器才能被改写值。任何MCU的任何外设都需要有时钟,8051也是如此;STM32为了让用户更好地掌握功耗,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。51单片机不用配置IO时钟,只是因为默认使用同一个时钟,这样是方便,但是这样的话功耗就降低不了。51中某个功能不需要,但是它还是一直运行。32中当你想关闭某个IO的时候,关闭它想对应的时钟使能就是了。

ARM的芯片都是这样,外设通常都是给了时钟后,才能设置它的寄存器(即才能使用这个外设),这么做的目的是为了省电,使用了所谓时钟门控的技术。

 

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

  ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

  ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

  ③、LSI是低速内部时钟,RC振荡器,频率为40kHz,看门狗时钟

  ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体,主要做RTC时钟源

  ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

 

         

        备注:MCO接口的两个作用 --①其上有选择开关,可以观察波形是否正常   

                            --②可以作为其他部件的时钟

   

  系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:

  ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。

  ②、通过8分频后送给Cortex的系统定时器时钟。

  ③、直接送给Cortex的空闲运行时钟FCLK。

  ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

 

  ⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

HCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟,HCLK是高速外设时钟,是给外部设备的,比如内存,flash。

 STM32单片机的时钟可以由以下3个时钟源提供:

   1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差

   2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟

   3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用

 stm32单片机的将时钟信号(例如HSE)经过分频或倍频(PLL)后,得到系统时钟,系统时钟经过分频,产生外设所使用的时钟。 

 

设置时钟流程:

 

       1、将RCC寄存器重新设置为默认值 RCC_DeInit

 

       2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);

 

       3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp();

 

 

       4、设置AHB时钟 RCC_HCLKConfig

 

       5、设置高速AHB时钟 RCC_PCLK2Config

 

       6、设置低速速AHB时钟 RCC_PCLK1Config

 

 

       7、设置PLL RCC_PLLConfig

 

       8、打开PLL RCC_PLLCmd(ENABLE);

 

       9、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

 

 

       10、设置系统时钟 RCC_SYSCLKConfig

 

       11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource()!= 0x08)

 

       12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()

 

 关于系统时钟配置分为寄存器配置和固件库配置两种:

  (1)固件库配置

    

void RCC_Config(void)
{
  RCC_DeInit(); //设置RCC寄存器默认值

  RCC_HSEConfig(RCC_HSE_ON); //使能外部高速时钟HSE
  while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET);//等待HSE使能就绪

  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//enable prefetch buffer(开启预取指令功能,可以提高效率)
  FLASH_SetLatency(FLASH_Latency_2); //flash 2 wait state

  RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK=SYSCLK
  RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1=HCLK/2
  RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2=HCLK

  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//PLLCLK=8*9
  RCC_PLLCmd(ENABLE); //enable PLLCLK
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//wait till PLLCLK is ready

  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//select PLL as system clock
  while(RCC_GetSYSCLKSource()!=0x08); //wait till PLL is used as system clock source


}

参考:http://blog.csdn.net/u011784994/article/details/53057736      

原文地址:https://www.cnblogs.com/darren-pty/p/darren_32.html