STM32---时钟

一、时钟的概念

        时钟是由电路产生的具有周期性的脉冲信号,相当于单片机的心脏,要想使用单片机的外设就必须开启相应的时钟,驱动外设的本质是操作寄存器,而寄存器是由D触发器构成,而触发器需要时钟才能改写值,所以想要操作寄存器必须开启对应外设的时钟

       

        时钟周期T和频率f换算公式:f = 1/T

        1kHz=1000Hz,1MHz=1000000Hz,1GHz=1000MHz

二、时钟树

        STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,主要也是为了降低整个芯片的功耗,所有外设时钟默认都是关闭状态(disable)当我们使用某个外设就要开启这个外设的时钟(enable),不同外设需要的时钟频率不同,没必要所有的外设都用高速时钟造成浪费,而且有些外设也接受不了这么高的频率,这也是为什么STM32有五个时钟源的原因,就是兼容不同速度的外设,STM32的五个时钟源分别为:HSELSEHSILSIPLL

1、HSE(高速外部时钟)

来源:晶振,通常使用8M

作用:可不分频或2分频(频率/2)作为PLL锁相环的输入,还可直接不分频作为系统时钟,128分频作为外设RTC时钟的输入控制

        HSE晶体可以通过设置时钟控制寄存器里RCC_CR中的HSEON位被启动和关闭,在时钟控制寄存器RCC_CR中的HSERDY位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置‘1’,时钟才被释放出来

2、HSI(高速内部时钟)

来源:芯片内部,大小为8M,当HSE故障时,系统时钟会自动切换到HSI,直到HSE启动成功

作用:可直接作为系统时钟或在2分频后作为PLL输入。HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。

控制:时钟控制寄存器中的HSIRDY位用来指示HSI RC振荡器是否稳定。在时钟启动过程中,直到这一位被硬件置‘1’,HSI RC输出时钟才被释放。HSI RC可由时钟控制寄存器中的HSION位来启动和关闭。如果HSE晶体振荡器失效,HSI时钟会被作为备用时钟源

3、LSI(低速内部时钟)

来源:内部芯片,LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,LSI时钟频率大约40kHz(在30kHz和60kHz之间)。

作用:为独立看门狗和自动唤醒单元(RTC)提供时钟

控制:LSI RC可以通过控制/状态寄存器(RCC_CSR)里的LSION位来启动或关闭在控制/状态寄存器(RCC_CSR)里的LSIRDY位指示低速内部振荡器是否稳定。在启动阶段,直到这个位被硬件设置为‘1’后,此时中才被释放。

4、LSE(低速外部时钟)

来源:LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。

作用:直接作为RTC是时钟来源

控制:LSE晶体通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭。在备份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶体震荡是否稳定。在启动阶段,直到这个位被硬件置‘1’后,LSE时钟信号才被释放出来

三、系统时钟初始化函数

函数实现:

//定义时钟配置函数
//第一个参数:指定HSE分频系数:
//RCC_PLLSource_HSE_Div1:采用8MHz作为HSE时钟大小
//RCC_PLLSourse_HSE_DIV2:采用8/2=4MHz作为HSE时钟大小
//第二个参数:指定PLL倍频系数
//如果是9倍:RCC_PLLMul_9
void RCC_HSE_Config(u32 div,u32 pllm){
	//1.将RCC寄存器的值设置为默认值
	RCC_DeInit();
	//2.使用HSE外部时钟源,采用无源晶振,不用旁路
	RCC_HSEConfig(RCC_HSE_ON);
	//3.一旦HSE准备就绪就可以配置其他时钟
	if(RCC_WaitForHSEStartUp() == SUCCESS){
		//4.配置AHB总线时钟HCLK,1分频,HCLK=SYSCLK
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		//5.配置APB1总线时钟PCLK1,2分频,PCLK1=HCLK/2
		RCC_PCLK1Config(RCC_HCLK_Div2);
		//6.配置APB2总线时钟PCLK2,1分频,PCLK2=HCLK
		RCC_PCLK2Config(RCC_HCLK_Div1);
		//7.配置PLL的时钟源为HSE/2,并且配置PLL倍频系数为9,16...
		RCC_PLLConfig(div,pllm);
		//8.启动PLL,结果此时时钟路线:8MHz->PLL*9=PLLCLK=72Mz
		RCC_PLLCmd(ENABLE);
		//9.判断PLL是否准备继续,没有准备就绪死等
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
		//10.选择PLLCLK作为SYSCLK时钟源:时钟路线:晶振8MHz->PLL*9=PLLCLK=72MHz->SYSCLK
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		//11.判断确保SYSCLK一定是PLLCLK
		while(RCC_GetSYSCLKSource()!=0x08);	
	}
}
void main(void){
    //初始化HSE,PLL,PLLCLK,SYSCLK,HCLK,PCLK1,PCLK2
	RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//SYSCLK=72MHz,CPU核时钟=FLCK=72MHz,正常速度
    //RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//SYSCLK=36MHz,CPU核时钟=FLCK=36MHz,慢速
	//RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_16);//SYSCLK=128MHz,CPU核时钟=FLCK=128MHz,快速(超频)
    while(1){
    LED1 = !LED1;
    Delay(0x1FFFFF); 
    }
}

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值