STM32时钟配置函数详解

1 篇文章 0 订阅

STM32时钟配置函数详解

一:STM32F1时钟树图
在这里插入图片描述
上图从左往右看,就是整个 STM32 的时钟走向。这里,我们挑选出 4 个重要的地方进行
介绍(图 5.2.2.1 中标出的 1~4)。
1、 PLL
PLL 用于设置 STM32 的 PLLCLK,STM32 支持 2~16 倍频设置。我们常用的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。从上图可以看出,PLLMUL 的时钟源,可以来自内部(HSI) 8M RC 振荡/2 或者外部(HSE)高速晶振(4~16Mhz)。这里切记PLLMUL设置后的频率不要超过72Mhz
2、 SW(开关)
SW 是 STM32 的 SYSCLK(系统时钟)切换开关,从上图可以看出,SYSCLK 的来源可以是3个:HSI、PLLCLK和HSE。我们一般选择PLLCLK作为SYSCLK。SYSCLK最大为 72M。这里提示一下大家:STM32 刚上电的时候,用的是系统内部 8M RC 时钟,之后运行程序才会把时钟源设置为其他。
3、 PCLK1
PCLK1 是 APB1 总线上外设的时钟,最大为 36Mhz,所有挂载在 APB1 上的外设,最大时钟都是 36Mhz,比如串口 2~5、SPI2 和 SPI3 等,
在使用的时候,要特别留意。PCLK1 的时钟可以通过 APB1 预分频器设置,我们默认一般设置为 2 分频。
4、 PCLK2
PCLK2 是 APB2 总线上外设的时钟,最大为 72Mhz,所有挂载在 APB2 上的外设,最大时钟都是 72Mhz,比如 GPIOA~G、串口 1、SPI1、ADC1~3 等。 PCLK2 的时钟可以通过 APB2 预分频器设置,我们默认一般设置为 1,也就是不分频。
5、 系统滴答时钟(SYSTICK)(没有画出)
SYSTICK 就是 CortexM3 的系统滴答时钟,SYSTICKAHB 分频后再 8 分频,因为我们一般设置 AHB 不分频,所以 SYSTICK 的频率就等于SYSCLK/8,如果 SYSCLK 为 72M,那么 SYSTICK 的频率就是 9Mhz。延时函数,就是基于 SYSTICK 来实现的。
总结:
在这里插入图片描述

在这里插入图片描述
二:Stm32_Clock_Init函数详解
首先是两个关键的寄存器:
在这里插入图片描述在这里插入图片描述相关语句讲解:

MYRCC_DeInit();	

该函数实现外设的复位,并关断所有中断,同时调用向量表配置函数MY_NVIC_SetVectorTable,配置中断向量表

RCC->CR|=0x00010000; 

将CR寄存器第16位置1,即开启外部高速时钟HSE:
在这里插入图片描述

while(!(RCC->CR>>17))

外部振荡器开启后,需要一段时间稳定下来,当CR寄存器第17位为1时,表明外部振荡器已经稳定
在这里插入图片描述

RCC->CFGR=0X00000400; 

将CFGR寄存器第7:4位置0,10:8位置为100,第13:11位置为0,即设置APB1的分频系数为2,APB2的分频系数为1,HB的分频系数为1
在这里插入图片描述

在这里插入图片描述

PLL-=2;
RCC->CFGR|=PLL<<18;  

观察CFGR的第21:18位可以看出其相应的位的值位倍频值减去2,所以该步骤为设置PLL的倍频系数,当PLL为9时,系统时钟频率为8*9=72MHz
在这里插入图片描述

RCC->CFGR|=1<<16;

HSE时钟作为PLL输入时钟。
在这里插入图片描述

RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));

在这里插入图片描述打开PLL并且等待就绪

RCC->CFGR|=0x00000002;

选择PLL作为系统时钟输入
在这里插入图片描述


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 个单位
	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;
	}    
}		

调用

Stm32_Clock_Init(9);        

配置完成之后,STM32的系统时钟如下图所示
在这里插入图片描述

参考:《STM32中文参考手册_V10》
《STM32不完全手册_寄存器版本_V3.1》

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32的定时器可以用于各种应用,比如延时、PWM、输入捕获、输出比较等。下面是STM32定时器的一些常用函数详解: 1. 定时器时钟使能函数:`void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)` 该函数用于初始化指定的定时器时钟,并配置相应的GPIO口,以使能定时器。 2. 定时器初始化函数:`HAL_TIM_Base_Init(TIM_HandleTypeDef *htim)` 该函数用于初始化定时器,并配置定时器的基本参数,比如时钟源、预分频系数、计数模式等。 3. 定时器启动函数:`HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)` 该函数用于启动定时器,开始计数。 4. 定时器停止函数:`HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)` 该函数用于停止定时器计数。 5. 定时器计数值设置函数:`HAL_TIM_Base_SetCounter(TIM_HandleTypeDef *htim, uint32_t Counter)` 该函数用于设置定时器的计数值。 6. 定时器计数值读取函数:`uint32_t HAL_TIM_Base_GetCounter(TIM_HandleTypeDef *htim)` 该函数用于读取定时器的当前计数值。 7. 定时器中断使能函数:`HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)` 该函数用于使能定时器的中断功能,当定时器计数完成时,会自动触发中断。 8. 定时器中断回调函数:`void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)` 该函数为定时器中断回调函数,当定时器计数完成时,会自动调用该函数。在该函数中可以编写相应的中断处理程序。 以上是一些常用的STM32定时器函数详解,可以根据需求选择相应的函数进行使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值