新手小白学习STM32-1:时钟配置
拿到了原始代码十分疑惑,到底时钟是什么情况?该怎么配置!我自己的学习经验分享一下,如有不正确的点,请各位大佬指正,不甚感谢!
首先要了解时钟树的概念
首先时钟树的独立时钟源有四种:
①HSI是高速内部时钟,RC振荡器,频率为8MHz。
②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③LSI是低速内部时钟,RC振荡器,频率为40kHz。
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体
注:可能会有说还有PLL时钟源,但是PLL(锁相环)是用于倍频系统时钟的模块,它需要一个时钟源作为输入。如果没有外部晶振或内部RC振荡器提供时钟源,PLL是无法工作的。所以不算一个独立时钟源。
使用内部时钟LSI、HSI,以及外部时钟LSE时,时钟源的频率是固定的,但外部时钟是需要外接32.768的晶振。
最特殊的是HSE高速外部时钟,它是可以外接4M-16M不固定频率的时钟源的。
以使用HSE时钟为例,探讨时钟配置是怎么样的一个过程
举例:现在A,B两地中间需要搭建一段输电线(A:独立时钟源,B:SYSCLK/RTCCLK),一般的正常过程:
1、先检查A地的线路是否有电。其实就是检查HSE是否正常,需要使用函数RCC_WaitForHSEStartUp来检查HSE是否正常!如果没电后续在做工作都是无用功。
if(RCC_WaitForHSEStartUp()==SUCCESS)
2、然后在AB间选择一条路线,并且搭建一条电线,但不会直接接通。因为和任何一侧接通,电线上都已经带电了,肯定不是安全的。所以我们根据这个思路,先在时钟源和SYSCLK之间选择一条链路。参考下图:
我们需要对进入PLL的时钟源选择,和进入SYSCLK的源选择,根据固件库手册可知需要使用的函数有下面两个:
①RCC_HSEConfig 选择HSE时钟进入PLL
②RCC_PLLConfig PLL时钟设置
RCC_HSEConfig(RCC_HSE_ON); //使用HSE时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
这样一顿操作,AB间的电线已经搭建好了!那就是接通问题了。
3、在拉闸之前,我们还要检查
1、B地间用户之间的电路连接是否正常,
2、有没有用户需要在使用前自己对电路进行调整的,需要对每个用户都进行检查一遍。
对于这个时钟树的操作就是PCLK1和PCLK2的的处理,需要用到下面三个函数
①RCC_HCLKConfig
②RCC_PCLK1Config
③RCC_PCLK2Config
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
4、全部确定完后就可以在A地开始合闸操作了。合闸后再B地检查合闸后的状态是否正常,在进行在B地的合闸工作。需要使用下面几个函数
①RCC_PLLCmd
②RCC_GetFlagStatus(RCC_FLAG_PLLRDY)
③RCC_SYSCLKConfig
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)!=SET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
5、最后在检查下用户使用是否正常
RCC_GetSYSCLKSource
综合上述所有操作可以知道整个配置过程如下:
void RCC_Configuration(void){
//PLL选择器失能
RCC_PLLCmd(DISABLE);
//1、先对RCC寄存器进行初始化
RCC_DeInit();
//2、设置时钟源的时钟源为HSE,其实就是对于时钟树的SW做选择
RCC_HSEConfig(RCC_HSE_ON); /*外部时钟是8MHZ*/
//3、等待HSE起振
while(RCC_WaitForHSEStartUp()!=SUCCESS);
//4、稳定后进行相应配置。PLL筛选器配置
/* RCC_PLLConfig参数1可选
RCC_PLLSource_HSI_Div2 PLL 的输入时钟 = HSI 时钟频率除以 2
RCC_PLLSource_HSE_Div1 PLL 的输入时钟 = HSE 时钟频率
RCC_PLLSource_HSE_Div2 PLL 的输入时钟 = HSE 时钟频率除以 2
*/
/*RCC_PLLConfig参数2可选
RCC_PLLMul_2 PLL 输入时钟 x 2
RCC_PLLMul_3 PLL 输入时钟 x 3
RCC_PLLMul_4 PLL 输入时钟 x 4
RCC_PLLMul_5 PLL 输入时钟 x 5
RCC_PLLMul_6 PLL 输入时钟 x 6
RCC_PLLMul_7 PLL 输入时钟 x 7
RCC_PLLMul_8 PLL 输入时钟 x 8
RCC_PLLMul_9 PLL 输入时钟 x 9
RCC_PLLMul_10 PLL 输入时钟 x 10
RCC_PLLMul_11 PLL 输入时钟 x 11
RCC_PLLMul_12 PLL 输入时钟 x 12
RCC_PLLMul_13 PLL 输入时钟 x 13
RCC_PLLMul_14 PLL 输入时钟 x 14
RCC_PLLMul_15 PLL 输入时钟 x 15
RCC_PLLMul_16 PLL 输入时钟 x 16
*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /*由此步骤,系统时钟=外部时钟*1*9=72MHZ*/
//5、对AHB时钟进行配置
/*
RCC_SYSCLK_Div1 AHB 时钟 = 系统时钟
RCC_SYSCLK_Div2 AHB 时钟 = 系统时钟 / 2
RCC_SYSCLK_Div4 AHB 时钟 = 系统时钟 / 4
RCC_SYSCLK_Div8 AHB 时钟 = 系统时钟 / 8
RCC_SYSCLK_Div16 AHB 时钟 = 系统时钟 / 16
RCC_SYSCLK_Div64 AHB 时钟 = 系统时钟 / 64
RCC_SYSCLK_Div128 AHB 时钟 = 系统时钟 / 128
RCC_SYSCLK_Div256 AHB 时钟 = 系统时钟 / 256
RCC_SYSCLK_Div512 AHB 时钟 = 系统时钟 / 512
*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//6、对APB1时钟进行配置
RCC_PCLK1Config(RCC_HCLK_Div2); /*其实就是对于APB1的时钟进行配置*/
//7、对APB2时钟进行配置
RCC_PCLK2Config(RCC_HCLK_Div1); /*其实就是对于APB2的时钟进行配置*/
//8、使能PLL选择器
RCC_PLLCmd(ENABLE);
/*需要再上述都配置好后进行使能,否则可能会造成默认参数进行分频和倍频造成的结果带来的不可预测影响,当让可以在程序进入时先进行失能*/
//9、等待PLL启动
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)!=SET); /*返回值为SET时,PLL启动成功*/
//10、配置系统时钟源为PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//11、等待系统时钟源切换完成
while(RCC_GetSYSCLKSource() != 0x08);
}
作者:大J宇