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

编程入门 行业动态 更新时间:2024-10-27 06:24:13

使用HSE或HSI重新配置系统<a href=https://www.elefans.com/category/jswz/34/1769919.html style=时钟"/>

使用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重新配置系统时钟

本文发布于:2024-03-05 14:37:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712565.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:时钟   系统   HSE   HSI

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!