×
单片机 > 单片机程序设计 > 详情

STM32F1RCC时钟配置总结

发布时间:2020-08-28 发布时间:
|

三种不同的时钟源可被用来驱动系统时钟(SYSCLK):


● HSI振荡器时钟


● HSE振荡器时钟


● PLL时钟


这些设备有以下2种二级时钟源:


● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。 RTC用于从停机/


待机模式下自动唤醒系统。


● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。


当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。


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


设置时钟流程:


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


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


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


4、设置PLL                          RCC_PLLConfig


5、打开PLL                          RCC_PLLCmd(ENABLE);


6、设置系统时钟                     RCC_SYSCLKConfig


7、设置AHB时钟        RCC_HCLKConfig;


8、设置低速速AHB时钟                 RCC_PCLK1Config


9、设置高速AHB时钟                   RCC_PCLK2Config;


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


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


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


void RCC_init(void)


{


  RCC_ClocksTypeDef RCC_ClockFreq;


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


  #ifdef ClockSource_HSE


  /*-----------------------------------


   优先选择外部时钟


  ------------------------------------*/


   // Enable HSE


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


 


  // Wait till HSE is ready   


  if (RCC_WaitForHSEStartUp() == SUCCESS) //3、等待外部高速时钟晶振工作


  {


/* Enable Prefetch Buffer */


    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //使能或禁止预取缓存区,FLASH的读写均需要时间,设置等待周期是为了确保正确的读写。因为cpu的速度远远大于FLASH的操作速度。用库函数 FLASH_SetLatency(FLASH_Latency_2)来设置。3、开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的


    /* Flash 2 wait state */


    FLASH_SetLatency(FLASH_Latency_2);


 


 


    // PLLCLK = 8MHz * 9 = 72 MHz


    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //4、设置PLL                          


 


    // Enable PLL


    RCC_PLLCmd(ENABLE); //5、打开PLL


 


    // Select PLL as system clock source   72M //6、设置系统时钟


    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


 


    //HCLK = SYSCLK  AHB   72M //7、设置AHB时钟


    RCC_HCLKConfig(RCC_SYSCLK_Div1);


 


    // PCLK1 = HCLK/2 APB1   36M


    RCC_PCLK1Config(RCC_HCLK_Div2); //8、设置低速速AHB时钟


    


    // PCLK2 = HCLK APB2   72M


    RCC_PCLK2Config(RCC_HCLK_Div1); //9、设置高速速AHB时钟


 


/* ADCCLK = PCLK2/4 */


    RCC_ADCCLKConfig(RCC_PCLK2_Div4);


 


    // Wait till PLL is ready


    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //10、等待PLL工作


 


    // Wait till PLL is used as system clock source


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


return;


  }  


  #endif


  


  /*-----------------------------------


  内部HSI时钟选择


  ------------------------------------- */


    RCC_HSICmd(ENABLE);


   


    // 8M/2*9=36M


 


    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);


 


    // HCLK = SYSCLK AHB   36M


    RCC_HCLKConfig(RCC_SYSCLK_Div1);


 


    // PCLK1 = HCLK/2 APB1 36M


    RCC_PCLK1Config(RCC_HCLK_Div1);


    


    // PCLK2 = HCLK  APB2 36M


    RCC_PCLK2Config(RCC_HCLK_Div1);      


 


// Enable PLL


    RCC_PLLCmd(ENABLE);


 


// Wait till PLL is ready


    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);


    


// Select PLL as system clock source


    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


 


     // Wait till PLL is used as system clock source


    while (RCC_GetSYSCLKSource() != 0x08);   


 


RCC_GetClocksFreq(&RCC_ClockFreq);//查看频率值


}


关键字:STM32F1  RCC  时钟配置 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容