STM32 的一个典型的时钟配置程序(暨系统时钟笔记)
最近在玩STM32了,学的还不算太深入,不过感觉不错,不说别的, 这个是STM32的学习笔记在<<蒙博宇>>老师的书上的一个典型的时钟配置程序,
以上是官方资料汇总的时钟树结构,其中标注了时钟的一些限制条件.
/*************************************************** * 函数名称 :RCC_Configuration *输入 : void * 函数描述 : 为了熟悉是时钟配置 ,决定在原来的程序上加入自己的时钟配置函数 * 输出 : void * 注 : * 函数 : RCC_WaitForHSEStartUp 为等待HSE起振知道HSE就绪或者在超时的情况下退出 * 注2 : 已验证成功 * ************************************************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //定义对与错的枚举类型 RCC_DeInit(); //复位系统时钟 RCC_HSEConfig(RCC_HSE_ON); //开启HSE(外部告诉振荡器) HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待启振 /*判断是否起振成功,成功则进入if内部*/ if (HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择AHB时钟源为SYSCLK 的1分频 RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK2的是时钟源为AHB的1分频(实际就是把APB2的分频系数改为1) RCC_PCLK1Config(RCC_HCLK_Div2); //选择PCLK1的时钟源为AHB的2分频(APB1分频系数为2) FLASH_SetLatency(FLASH_Latency_2); //设置Flash延时周期数为2 (2级流水线技术) FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能Flash预取缓存 /*选择PLL的时钟源为HSE2分频,倍频系数为 5, 则PLL=(25 / 2)*5=62.5MHz.*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_5); RCC_PLLCmd(ENABLE);//使能PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL输出稳定 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择SYS时钟源为PLL while (RCC_GetSYSCLKSource() != 0x08); //等待PLL成为SYSCLK的时钟源 } RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开APB2外设GPIOD的时钟 }
总的来说就是以SYSCLK为分界点,你要先让HSE或者HSI起振,并且等待其稳定,之后配置右边的HCLK,PCLK2和PCLK1,以及这些输出的是时钟,可以看到代码进入后,先配置了HCLK,这样APB1和APB2的输入源就确定了(配置HCLK实际上就是在设置AHB),之后的PCLK2和PCLK1也是如法炮制,在这开始配置PLL的源和PLL的倍频系数(如果使用PLL作为SYSCLK源的情况下,从时钟树中能够看出,SYSCLK的源可选项有三个),最后是使PLL成为SYSCLK的源.在函数的最后一行我们看见打开了APB2 的外设是时钟,从这里时钟走出了时钟树,因为对外设的结构还不清楚,以后在补.