码迷,mamicode.com
首页 > 其他好文 > 详细

32系统时钟配置

时间:2017-12-11 18:46:07      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:images   pll   flash   use   http   范围   startup   单片机   振荡器   

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

 

在STM32中,有五个时钟源,为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。

         技术分享图片

        备注: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分频。

 

 

 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      

32系统时钟配置

标签:images   pll   flash   use   http   范围   startup   单片机   振荡器   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!