原创 STM 时钟分析浅谈

2010-4-1 15:02 2434 5 5 分类: MCU/ 嵌入式

STM32中,有五个时钟源,为HSIHSELSILSEPLL <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


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


 




HSE/LSE时钟源


 


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


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


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


 




STM32时钟系统的框图


 


STM32上如果不使用外部晶振,OSC_INOSC_OUT的接法


如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:



1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。
2)对于少于100脚的产品,有2种接法:
  2.1OSC_INOSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。
  2.2)分别重映射OSC_INOSC_OUTPD0PD1,再配置PD0PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。

 


使用外部时钟代码如下:系统时钟为:72M


void RCC_Configuration(void)
{  
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();


  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);


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


  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
 
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);


    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);


    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


    /* 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)
    {
    }
  }
     
}


 


使用内部时钟代码如下: 系统时钟为:64M


 


void RCC_Configuration(void)
{  
  /* RCC system reset(for debug purpose) */
 //  ErrorStatus HSEStartUpStatus;
 
  //将外设 RCC寄存器重设为缺省值
  RCC_DeInit();


RCC_HSICmd(ENABLE);
 
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
  {
  }
  if(1)
  {
  
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_2);
  
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    RCC_PCLK2Config(RCC_HCLK_Div1);
 
    RCC_PCLK1Config(RCC_HCLK_Div2);
   
    //设置 PLL 时钟源及倍频系数
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
 
               
    //使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
    RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
    //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }


    //设置系统时钟(SYSCLK) 设置PLL为系统时钟源
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
 
    //等待PLL成功用作于系统时钟的时钟源
    //  0x00:HSI 作为系统时钟
    //  0x04:HSE作为系统时钟
    //  0x08:PLL作为系统时钟 
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }


文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条