使用HSE或HSI重新配置系统时钟

本文详细介绍了如何通过STM32的HSE和HSI时钟源重新配置系统时钟,包括复位、HSE/HSI启用、等待稳定、设置总线及PLL时钟,并提供了关键步骤的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

    该程序主要是通过HSE和HSI进行系统时钟的重新设置,具体的设置方法参考stm32时钟树的原理图,设置过程中注意设置的顺序即可。


一、时钟树

来自stm32的中文参考手册

具体的时钟配置关系如图所示
在这里插入图片描述

二、配置过程

1.使用HSE来配置

①系统时钟的复位

    因为在main函数之前我们的系统时钟已经在启动文件中配置好了,所以我们应该先进行复位,然后重新设置。对应的固件库函数为RCC_DeInit();

②使能HSE

    对应的固件库函数为:RCC_HSEConfig(RCC_HSE_ON);

③等待HSE稳定设置相关的总线时钟

需要注意的是,在设置完相关的总线的时钟后才返回去,进行PLL时钟的相关设置,顺序不能变。
    HSE稳定后进行flash相关的设置。
    关于为什么要设置flash相关的寄存器,在stm32闪存编程中的解释是
    使能FLASH指令缓冲器,用于当CPU主频提升后缓存多条指令已避免CPU等待FLASH传数据导致的时间浪费,“预取缓冲区(2个64位):在每一次复位以后被自动打开,由于每个缓冲区的大小(64位)与闪存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。由于预取缓冲区的存在,CPU可以工作在更高的主频。CPU每次取指最多为32位的字,取一条指令时,下一条指令已经在缓冲区中等待。”
     总得来说就是在你设置完系统的时钟后,要通过缓冲区的个数使得cpu正常的工作。
    具体的设置参数如下
在这里插入图片描述
    接下来就是设置HCLK,APB1,APB2的时钟
对应的库函数为:
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK1Config( RCC_HCLK_Div2);
    RCC_PCLK2Config(RCC_HCLK_Div1);

④配置PLL的时钟来源和倍频因子

    有关超频的设置,在这里改动倍频因子即可,一般不要设置超频,因为有可能导致你的程序进行数据相关的操作的时候出现问题。
    对应的库函数为:RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul);

⑤使能后等待稳定并选择作为系统时钟

    使能PLL时钟
对应的库函数为:RCC_PLLCmd(ENABLE);
    等待PLL稳定
对应的库函数为:RCC_GetFlagStatus(RCC_FLAG_PLLRDY);
    选择PLL作为系统时钟
对应的库函数为: RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

代码如下(示例):

void HSE_SetSysClk(uint32_t RCC_PLLMul)
{
	 uint32_t HSEStatus = 0;
	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_ON);
	HSEStatus =  RCC_WaitForHSEStartUp();
	if(HSEStatus == SUCCESS)
	{
		FLASH->ACR |= FLASH_ACR_PRFTBE;
		
		FLASH->ACR &= ((uint32_t)~FLASH_ACR_LATENCY);
		FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;  
		
		RCC_HCLKConfig(RCC_SYSCLK_Div1);//72M
		RCC_PCLK1Config( RCC_HCLK_Div2);//36M
		RCC_PCLK2Config(RCC_HCLK_Div1);//72M
		
		RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul);
		RCC_PLLCmd(ENABLE);
		 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
		
		 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		
		 while(RCC_GetSYSCLKSource()!=0x08);
		
	}
	else
	{
		//启动失败
		//一般是晶振坏了  或者电容出问题
	}
}

2.使用HSI来配置

原理与HSI类似
代码如下(示例):

void HSI_SetSysClk(uint32_t RCC_PLLMul)
{
	 uint32_t HSIStatus = 0;
	
	RCC_DeInit();

	RCC_HSICmd(ENABLE);
	
	HSIStatus = RCC->CR & RCC_CR_HSIRDY;
	if(HSIStatus == RCC_CR_HSIRDY)
	{
	
		FLASH->ACR |= FLASH_ACR_PRFTBE;
		
		FLASH->ACR &= ((uint32_t)~FLASH_ACR_LATENCY);
		FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;  
		
		RCC_HCLKConfig(RCC_SYSCLK_Div1);//72M
		RCC_PCLK1Config( RCC_HCLK_Div2);//36M
		RCC_PCLK2Config(RCC_HCLK_Div1);//72M
		
		RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul);
		
		RCC_PLLCmd(ENABLE);
		
		 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
		
		 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		
		 while(RCC_GetSYSCLKSource()!=0x08);
	
	}
	else
	{
		//启动失败
		//一般是晶振坏了  或者电容出问题
	}

}

总结

20210718

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值