时钟"/>
使用HSE或HSI重新配置系统时钟
文章目录
- 前言
- 一、时钟树
- 二、配置过程
- 1.使用HSE来配置
- ①系统时钟的复位
- ②使能HSE
- ③等待HSE稳定设置相关的总线时钟
- ④配置PLL的时钟来源和倍频因子
- ⑤使能后等待稳定并选择作为系统时钟
- 2.使用HSI来配置
- 总结
前言
该程序主要是通过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);//72MRCC_PCLK1Config( RCC_HCLK_Div2);//36MRCC_PCLK2Config(RCC_HCLK_Div1);//72MRCC_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);//72MRCC_PCLK1Config( RCC_HCLK_Div2);//36MRCC_PCLK2Config(RCC_HCLK_Div1);//72MRCC_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
更多推荐
使用HSE或HSI重新配置系统时钟
发布评论