stm32时钟系统配置

来源:互联网 发布:ubuntu使用wine 编辑:程序博客网 时间:2024/05/16 13:49



1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。
 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。    

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

③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。    

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

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

2. 系统时钟SYSCLK可来源于三个时钟源:       

①、HSI振荡器时钟
②、HSE振荡器时钟
③、PLL时钟
3.STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。
4.任何一个外设在使用之前,必须首先使能其相应的时钟。


相关配置函数:

1.时钟使能配置:
      RCC_LSEConfig() 、RCC_HSEConfig()、
      RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……


2.时钟源相关配置:
      RCC_PLLConfig ()、 RCC_SYSCLKConfig() 、 RCC_RTCCLKConfig() …


3.分频系数选择配置:
      RCC_HCLKConfig() 、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…


4.外设时钟使能:
      RCC_APB1PeriphClockCmd():  //APB1线上外设时钟使能
     RCC_APB2PeriphClockCmd();  //APB2线上外设时钟使能
     RCC_AHBPeriphClockCmd();   //AHB线上外设时钟使能


5.  其他外设时钟配置:
     RCC_ADCCLKConfig ();  RCC_RTCCLKConfig();


6.状态参数获取参数:
     RCC_GetClocksFreq();
     RCC_GetSYSCLKSource();
     RCC_GetFlagStatus()
7.  RCC中断相关函数 :
     RCC_ITConfig() 、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…


配置详细步骤: 

①时钟管理重置  RCC_DeInit();

②使能所需的时钟源,如HSI,LSI,HSE,LSE,等待起振

③配置各预分频(图中右边的)

FLASH_SetLatency(FLASH_Latency_2);   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //必不可少的步骤,可以参考stm32f10x.c中的System_Init()

⑤配置图中菱形选项。如,使能PLL,不管使能什么都要等待起振。

⑥设置SYSCLK.

如:

  RCC_DeInit();                                                                //时钟管理重置
    RCC_HSEConfig(RCC_HSE_ON);                                  //打开外部晶振       

while ( RCC_WaitForHSEStartUp() != SUCCESS);   //等待外部晶振就绪

    RCC_HCLKConfig(RCC_SYSCLK_Div1);                       //AHB使用系统时钟
RCC_PCLK2Config(RCC_HCLK_Div2);                          //APB2(高速)为HCLK的一半

RCC_PCLK1Config(RCC_HCLK_Div1);                          //APB1(低速)为HCLK

//注:AHB主要负责外部存储器时钟。PB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。


FLASH_SetLatency(FLASH_Latency_2);                      //flash操作的延时
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //flash读取缓冲,加速


RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MH
RCC_PLLCmd(ENABLE);                                              //启动PLL

while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}     //等待PLL启动


RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //将PLL设置为系统时钟源
while (RCC_GetSYSCLKSource() != 0x08){}     //等待系统时钟源的启动

0 0
原创粉丝点击