天天看点

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时钟
}
           

继续阅读