1. 程式人生 > >STM32F1RCC時鐘配置總結

STM32F1RCC時鐘配置總結

    STM32RCC時鐘配置總結

三種不同的時鐘源可被用來驅動系統時鐘(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);//檢視頻率值

}