`
anlx27
  • 浏览: 490491 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

stm32时钟配置

阅读更多

stm32的时钟比51种类多,在这归纳总结

 

一 stm32有五个时钟源,为HSIHSELSILSEPLL

 

 ①HSI是高速内部时钟,RC振荡器,频率为8MHz

 

 ②HSE   是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz

 

③LSI    是低速内部时钟,RC振荡器,频率为40kHz

 

 


LSE    是低速外部时钟,接频率为32.768kHz的石英晶体。


PLL  

为锁相环倍频输出,其时钟输入源可选择为HSI/2HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz

是低速外部时钟,接频率为32.768kHz的石英晶体。

是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz是高速内部时钟,RC振荡器,频率为8MHz。

  




二 使用HSE时钟,程序设置时钟参数流程:
1
、将RCC寄存器重新设置为默认值               RCC_DeInit;
2
、打开外部高速时钟晶振
HSE                       RCC_HSEConfig(RCC_HSE_ON);
3
、等待外部高速时钟晶振工作
                     HSEStartUpStatus = RCC_WaitForHSEStartUp();
4
、设置AHB时钟
                                              RCC_HCLKConfig;
5
、设置高速AHB时钟
                                      RCC_PCLK2Config;
6
、设置低速速AHB时钟
                                  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()




三 RCC的配置函数举例(使用外部8MHz晶振
)


/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    :  RCC
配置(使用外部8MHz晶振
)
* Input            :

* Output         :

* Return         :

*******************************************************************************/
void RCC_Configuration(void)
{
  /*
将外设RCC寄存器重设为缺省值 */
  RCC_DeInit();


  /*
设置外部高速晶振(HSE
*/
  RCC_HSEConfig(RCC_HSE_ON);   //RCC_HSE_ON——HSE
晶振打开
(ON)


  /*
等待HSE起振
*/
  HSEStartUpStatus = RCC_WaitForHSEStartUp();


  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
   
  /*
使能
PLL */
    RCC_PLLCmd(ENABLE);


    /*
检查指定的RCC标志位(PLL准备好标志)设置与否
*/   
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)     
       {
       }


    /*
设置系统时钟(SYSCLK
*/
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//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
时钟
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics