CPU时钟来源
振荡器
1、两个内部RC振荡器
a)内部高速振荡器(HSI)----> 8MHz
b)内部低速振荡器(LSI)----->32.768KHz:一般供给实时时钟与看门狗使用。
2、外部振荡器
a)高速外部振荡器(HSE OSC)----> <=25MHz:来源于石英/陶瓷共振体(该时钟波形可以为方波、正弦波或三角波,但必须为50%占空比)
b)低速外部振荡器(LSE OSC)---->典型值 32.768KHz:波形以及占空比与HSE同,LSE与LSI功能一样-给RTC以及IWDG使用,但它们都不是很准确,但是在设计实时时钟时一般采用LSE。
CPU时钟来源
CPU时钟可以来自HSI、HSE或者内部锁相环(PLL)。------>CPU可以不用在HSE下工作在最高频率,但是HSI不能准确且稳定地提供8MHz的时钟脉冲
无论使用哪种振荡源,都应该通过锁相环来产生最大频率供给CPU内核。
在产生复位操作后,STM32回首先使用HSI作为系统时钟,此时HSE处于关闭状态。要是STM32进入最高频率工作,首先就需要开启HSE并且等待其稳定。
/*
作者:Losingamong
时间:08/08/2008
*/
/*=定义枚举类型变量 HSEStartUpStatus*/
ErrorStatus HSEStartUpStatus;
/*复位系统时钟*/
RCC_DeInit();
/*开启HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/*等待HSE起振并稳定*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/*判断HSE是否起振成功,成功则进入配置环节*/
if (HSEStartUpStatus == SUCCESS )
{
/*选择HCLK(AHB)时钟源为SYSCLK1分频*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*选择PCLK1时钟源为HCLK(AHB)的2分频*/
RCC_PCLK1Config(RCC_HCLK_Div2);
/*选择PCLK2时钟源为HCLK(AHB)的1分频*/
RCC_PCLK1Config(RCC_HCLK_Div1);
/*设置FLASH延时周期为2*/
FLASH_SetLatency(FLASH_Latency_2);
/*使能FLASH预取缓存*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*选择锁相环(PLL)时钟源为HSE1分频,倍频数为9,则PLL输出频率为72MHz*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
/*使能PLL*/
RCC_PLLCmd(ENABLE);
/*等待PLL输出稳定*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/*选择SYSCLK时钟源为PLL*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*等待PLL成为SYSCLK的时钟源*/
while(RCC_GetSYSCLKSource() != 0x08);
}
/*打开APB2总线上的GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
说明:
在HSE激活之后,内部还需要通过AHB以及APB将时钟信号作用于不同的地方,所以在配置时钟的一般顺序是:
HSE->(PLL->SYSCLK)->AHB->APB(APB1,APB2)