一:基本知识
1、 STM32F103ZE有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、系统时钟源有3个:HSI振荡器时钟,HSE振荡器时钟,PLL时钟
3、STM32能够选择一个时钟信号输出到MCO脚(PA8)上,能够选择为PLL
输出的2分频、HSI、HSE、或者系统时钟。
4、不论什么一个外设在使用之前,必须首先使能其对应的时钟
详细的能够參考:http://www.openedv.com/posts/list/302.htm
二:时钟配置
//#define SystemClK_Flq_8M 8000000 //定义系统时钟8M频率
//#define SystemClK_Flq_12M 12000000
//#define SystemClK_Flq_16M 16000000
//#define SystemClK_Flq_24M 24000000
#define SystemClK_Flq_32M 32000000
//#define SystemClK_Flq_36M 36000000
//#define SystemClK_Flq_40M 40000000
//#define SystemClK_Flq_44M 44000000
//#define SystemClK_Flq_48M 48000000
//#define SystemClK_Flq_52M 52000000
//#define SystemClK_Flq_56M 56000000
//#define SystemClK_Flq_60M 60000000
//#define SystemClK_Flq_64M 64000000
//#define SystemClK_Flq_68M 68000000
//#define SystemClK_Flq_72M 72000000
/* //函数名称:RCC_HSI_Configuration //函数功能:启动内部快速时钟 //入口參数:无 //出口參数:无 //技术简要: / */ void RCC_HSI_Configuration(void) { RCC_DeInit(); //将外设RCC寄存器重设为缺省值 RCC_HSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);//等待HSI就绪 RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); #if defined (SystemClK_Flq_24M)//使用24M为时钟频率 RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);//设置PLL时钟源及倍频系数 #elif defined (SystemClK_Flq_32M) //使用32M为时钟频率 RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_8);//设置PLL时钟源及倍频系数 #elif defined (SystemClK_Flq_48M) //使用48M为时钟频率 RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//设置PLL时钟源及倍频系数 #else RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);//设置PLL时钟源及倍频系数 //内部RC震荡8M 有用倍频,固定须要2分频后倍频 为4M, //默认36M= 4M*9 #endif // RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//使用HSI为时钟源 //8M // while(RCC_GetSYSCLKSource() != 0x00); /*0x00:HSI作为系统时钟 */ RCC_PLLCmd(ENABLE);//使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);/*检查指定的RCC标志位(PLL准备好标志)设置与否*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*设置系统时钟(SYSCLK) */ while(RCC_GetSYSCLKSource() != 0x08);/*0x08:PLL作为系统时钟 */ } /* //函数名称:RCC_HSE_Configuration //函数功能:启动外部快速时钟 //入口參数:无 //出口參数:无 //技术简要: / */ void RCC_HSE_Configuration(void) { RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */ RCC_HSEConfig(RCC_HSE_ON);/*设置外部快速晶振(HSE) HSE晶振打开(ON)*/ if(RCC_WaitForHSEStartUp() == SUCCESS)/*等待HSE起振, SUCCESS:HSE晶振稳定且就绪*/ { RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置AHB时钟(HCLK) RCC_SYSCLK_Div1——AHB时钟 = 系统时*/ RCC_PCLK1Config(RCC_HCLK_Div2); /*设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK / 2*/ FLASH_SetLatency(FLASH_Latency_2);/*设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期*/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*选择FLASH预取指缓存的模,预取指缓存使能*/ #if defined (SystemClK_Flq_24M)//使用24M为时钟频率 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_3);/*设置PLL时钟源及倍频系数*/ #elif defined (SystemClK_Flq_32M) //使用32M为时钟频率 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);/*设置PLL时钟源及倍频系数*/ #elif defined (SystemClK_Flq_48M) //使用48M为时钟频率 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);/*设置PLL时钟源及倍频系数*/ #else RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*设置PLL时钟源及倍频系数*/ //默认晶振8M 时钟频率72M #endif RCC_PLLCmd(ENABLE);/*使能PLL */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);/*检查指定的RCC标志位(PLL准备好标志)设置与否*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*设置系统时钟(SYSCLK) */ while(RCC_GetSYSCLKSource() != 0x08);/*0x08:PLL作为系统时钟 */ } }