当前位置:网站首页>STM32学习总结(一)——时钟RCC

STM32学习总结(一)——时钟RCC

2022-08-11 05:25:00 LIGAZN菜鸟

系列文章目录

第一章 STM32学习总结(一)——时钟RCC


前言

一开始接触STM32时就被时钟难住了,复杂的时钟树上的条条框框对于初学者真的很不友好,但是后面详细且耐心地去看时,还是能get到很多东西,时钟树也成了后续编程主要查阅的资料之一。以下是我对于STM32时钟系统的理解,参考了下面这位大佬的博客。(25条消息) 【STM32】系统时钟RCC详解(超详细,超全面)_Z小旋的博客-CSDN博客_stm32时钟


一、时钟是什么?

时钟是MCU的生命源泉,没有时钟信号,CPU和任何外设都不能工作。学习单片机一开始就应该弄懂所学单片机的时钟系统,这可以为后续的外设开发和灵活使用单片机奠定基础。


二、STM32时钟树

1.时钟树

转载自(25条消息) 【STM32】系统时钟RCC详解(超详细,超全面)_Z小旋的博客-CSDN博客_stm32时钟

2.时钟源

STM32有四个时钟源,这四种时钟源根据时钟频率高低又可以分为高速时钟源和低速时钟源,其中高速时钟源分别是内部8MHz的RC振荡器产生的HSI时钟信号,高速外部时钟信号(HSE)。低速时钟源分别是一个32.768kHz的低速外部晶体或陶瓷谐振器产生的LES时钟信号,低功耗时钟源LSI,时钟频率大约40kHz。

3.时钟系统

3.1 由时钟树可知,HSI和HSE以及PLL锁相环倍频器的PLLCLK经选择器用于系统时钟,如下图

系统时钟经过AHB预分频和APB预分频作用于各个外设。每个APB预分频线都是一个时钟总线,特定的外设会挂在特定的总线上,例如通用定时器的挂在APB1时钟总线上,经过特定的预分频系数后得到一个精准的时钟频率,用于定时器的计时。

3.2 LSE和LSI作用于RTC时钟和独立看门狗时钟

三、STM32时钟配置

1.系统时钟配置

上文提到了,STM32的系统时钟由HSE和HSI以及两者的倍频时钟PLLCLK,三者之一提供,我们在具体使用时,首先需要配置系统时钟,一般常见的SYSCLK为最高系统时钟频率72MHZ,这是经HSE的外部8M晶振时钟经PLL锁相环8倍频得来的。官方的标准库提供了系统时钟配置函数Stm32_Clock_Init(u8 PLL),PLL选择的是PLL锁相环倍频系数,一般情况下是9,在主函数的开头会调用这个函数。

void Stm32_Clock_Init(u8 PLL)
{
	unsigned char temp=0;   
	MYRCC_DeInit();		  //复位并配置向量表
 	RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
	while(!(RCC->CR>>17));//等待外部时钟就绪
	RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
	PLL-=2;				  //抵消2个单位(因为是从2开始的,设置0就是2)
	RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
	RCC->CFGR|=1<<16;	  //PLLSRC ON 
	FLASH->ACR|=0x32;	  //FLASH 2个延时周期
	RCC->CR|=0x01000000;  //PLLON
	while(!(RCC->CR>>25));//等待PLL锁定
	RCC->CFGR|=0x00000002;//PLL作为系统时钟	 
	while(temp!=0x02)     //等待PLL作为系统时钟设置成功
	{   
		temp=RCC->CFGR>>2;
		temp&=0x03;
	}    
}		    

2.外设时钟配置

在配置相关外设时需要先使能相关时钟,我们只需要需要通过查阅时钟树了解该外设是挂在哪个总线上的,然后使用固件库中的时钟使能函数使能相关函数就可以了,和配置寄存器比较,这是非常方便且省时的!下面提供一段配置TIM2为定时器中断的程序,在配置相关参数前就使能了定时器的时钟,关于定时器的相关配置和学习总结会在后续文章中详细记录,有需要的可以关注后续的文章。

void TIM2_Int_Init(u16 arr,u16 psc)//定时器2中断初始化  arr为重装载值 psc为分频系数 主函数要进行中断分组
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//定时器时钟使能
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=arr;
	TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//定时器初始化,配置参数
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//设置更新中断
	
	NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	
	NVIC_Init(&NVIC_InitStruct);
	TIM_ARRPreloadConfig(TIM2,ENABLE);
	TIM_Cmd(TIM2,ENABLE);//使能TIM2定时器
}

总结

以上就是关于STM32时钟的全部学习总结,本人也是完全自学,如有错误或者理解不到位的地方以及博客写作的问题,请各位大佬在评论区指出!第一次学习时钟时一脸懵逼,后面每一次回顾都有不同程度的理解,这才知道学习贵在坚持,持之以恒的学习才能克服更多困难,大家一起加油,冲就够了!

原网站

版权声明
本文为[LIGAZN菜鸟]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_58838850/article/details/126196369