天天看點

STM32 時鐘總結

STM32 時鐘源

  • HSI是高速内部時鐘,RC振蕩器,頻率為8MHz,精度不高。
  • HSE是高速外部時鐘,可以由有源晶振或者無源晶振提供,頻率從 4-26MHZ不等。當使用有源晶振時,時鐘從 OSC_IN 引腳進入, OSC_OUT 引腳懸空,當選用無源晶振時,時鐘從 OSC_IN 和 OSC_OUT 進入,并且要配諧振電容LSI是低速内部時鐘,RC振蕩器,頻率為40kHz,提供低功耗時鐘。
  • LSI是低速内部時鐘,RC振蕩器,頻率為40kHz 
  • LSE是低速外部時鐘,接頻率為32.768kHz的石英晶體。
  • PLL為鎖相環倍頻輸出,其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為2~16倍,可是其輸出頻率最大不得超過72MHz。

系統時鐘源有3個:HSI振蕩器時鐘,HSE振蕩器時鐘,PLL時鐘。

AHB總線時鐘HCLK:系統時鐘 SYSCLK 經過 AHB 預分頻器分頻之後得到時鐘叫 APB 總線時鐘,即 HCLK,分頻因子可以是:[1,2,4,8,16,64,128,256,512], 具體的由時鐘配置寄存器RCC_CFGR的HPRE 位設定。

APB2 總線時鐘HCLK2:APB2總線時鐘PCLK2由HCLK經過高速APB2預分頻器得到,分頻因子可以是:[1,2,4,8,16],具體由時鐘配置寄存器 RCC_CFGR 的PPRE2位設定。 HCLK2屬于高速的總線時鐘,片上高速的外設就挂載到這條總線上,比如全部的GPIO、 USART1、SPI1等。

APB1 總線時鐘HCLK:APB1總線時鐘PCLK1由HCLK 經過低速APB預分頻器得到,分頻因子可以是:[1,2,4,8,16],具體由時鐘配置寄存器RCC_CFGR的PPRE1位設定。HCLK1屬于低速的總線時鐘,最高為 45M,片上低速的外設就挂載到這條總線上,比如USART2/3/4/5、SPI2/3、I2C1/2 等。

STM32軟體固件庫的程式中對RCC的配置函數(使用外部8MHz晶振)

void RCC_Configuration(void)
{
  RCC_DeInit();/*将外設RCC寄存器重設為預設值*/
  /*設定外部高速晶振(HSE)*/
  RCC_HSEConfig(RCC_HSE_ON);   //RCC_HSE_ON——HSE晶振打開(ON)
  HSEStartUpStatus = RCC_WaitForHSEStartUp();/*等待HSE起振*/
  if(HSEStartUpStatus == SUCCESS)        //SUCCESS:HSE晶振穩定且就緒
  {
    /*設定AHB時鐘(HCLK)*/ 
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  //RCC_SYSCLK_Div1——AHB時鐘=系統時鐘
    /* 設定高速AHB時鐘(PCLK2)*/ 
    RCC_PCLK2Config(RCC_HCLK_Div1);   //RCC_HCLK_Div1——APB2時鐘= HCLK
    /*設定低速AHB時鐘(PCLK1)*/    
    RCC_PCLK1Config(RCC_HCLK_Div2);   //RCC_HCLK_Div2——APB1時鐘= HCLK / 2
    /*設定FLASH存儲器延時時鐘周期數*/
    FLASH_SetLatency(FLASH_Latency_2);    //FLASH_Latency_2  2延時周期
    /*選擇FLASH預取指緩存的模式*/
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   // 預取指緩存使能
    /*設定PLL時鐘源及倍頻系數*/
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); 
    // PLL的輸入時鐘= HSE時鐘頻率;RCC_PLLMul_9——PLL輸入時鐘x 9
    RCC_PLLCmd(ENABLE); /*使能PLL */
    /*檢查指定的RCC标志位(PLL準備好标志)設定與否*/   
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*設定系統時鐘(SYSCLK)*/
    //RCC_SYSCLKSource_PLLCLK——選擇PLL作為系統時鐘
    /* PLL傳回用作系統時鐘的時鐘源*/
    while(RCC_GetSYSCLKSource() != 0x08);//0x08:PLL作為系統時鐘
  }
  /*使能或者失能APB2外設時鐘*/    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | 
  RCC_APB2Periph_GPIOC , ENABLE); 
  //RCC_APB2Periph_GPIOA    GPIOA時鐘  //RCC_APB2Periph_GPIOB    GPIOB時鐘
  //RCC_APB2Periph_GPIOC    GPIOC時鐘  //RCC_APB2Periph_GPIOD    GPIOD時鐘
}
           

繼續閱讀