STM32的RCC配置

作者:阿拉丁神丢

转自:阿拉丁神丢


概念:

HSI振荡器时钟:
  系统上电默认时钟,内部振荡器 8MHZ,可以直接作为系统时钟或在2分频后作为PLL的输入。时钟频率精度较差
HSE 振荡器时钟 外部:
  提供非常精确的主时钟,板上的 8MHZ

PLL 倍频:
   时钟源输入: HSI时钟/2, HSE或通过一个可配置分频的PLL2时钟
LSE 时钟:
   LSE晶体是一个32.867的低速外部晶体。提供实时时钟
LSI时钟 Internal 内部:
   LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保存运行。为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约40KHZ。

STM32的RCC配置_第1张图片

 

配置时钟流程:

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

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

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

4.设置AHB时钟                      RCC_HCLKConfig;

5.设置高速APB2时钟                 RCC_PCLK2Config;

6.设置低速速APB1时钟               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()


 

 

 

//*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
//*******************************************************************************

ErrorStatus HSEStartUpStatus;

void RCC_Configuration(void)
{
    RCC_DeInit();    //RCC system reset 

    RCC_HSEConfig(RCC_HSE_ON);  // Enable HSE 

    HSEStartUpStatus = RCC_WaitForHSEStartUp();  // Wait till HSE is ready 

    if(HSEStartUpStatus == SUCCESS)
   {
        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_PCLK2Config(RCC_HCLK_Div1);         // PCLK2 = HCLK 

        RCC_PCLK1Config(RCC_HCLK_Div1);         // PCLK1 = HCLK 
#ifdef  HSE_Value_8M
        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);    // PLLCLK = 8MHz/2 * 9 = 36 MHz 
#elif defined HSE_Value_12M
        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_6);    // PLLCLK = 12MHz/2 * 6 = 36 MHz 
#endif
        RCC_PLLCmd(ENABLE); // Enable PLL 

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)     // Wait till PLL is ready 
        {}

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);      // Select PLL as system clock source 

        while(RCC_GetSYSCLKSource() != 0x08)            // Wait till PLL is used as system clock source 
        {}  
    }
  /* Enable PWR and BKP clocks 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  /* Enable DMA clock 
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  /* Enable AFIO clock 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  /*GPIOA Periph clock enable
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  /* GPIOB Periph clock enable 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  /* GPIOC Periph clock enable 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  /* GPI0D Periph clock enable 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  /* GPI0E Periph clock enable 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
  /* Enable TIM1 clock
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  /* EnableTIM2  TIM3  TIM4 clocks 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);
  /*Enable USART1 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  /* Enable USART2 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  /*Enable USART3 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  /*Enable  I2C1 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  /*Enable  ADC1 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  /*Enable ADC2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);
  /* DAC Periph clock enable 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
 
}


你可能感兴趣的:(STM32)