STM32系统时钟

发布者:平凡梦想最新更新时间:2025-09-17 来源: cnblogs关键字:STM32  系统时钟 手机看文章 扫描二维码
随时随地手机看文章

一、时钟

STM32有4个时钟源:

1)HSE(高速外部时钟源)  外部晶振作为时钟源,范围为4~16MHz,常取为8MHz

2)HSI(高速内部时钟源)  由内部RC振荡器产生,频率为8MHz,但不稳定

3)LSE(低速外部时钟)     以外部晶振作为时钟源,主要供给实时时钟模块,一般用32.768KHz。

4)LSI(低速内部时钟)         由内部RC振荡器产生,也是提供给实时时钟模块,频率约为40KHz。

二、系统启动过程中时钟设置过程

  以使用STM32库函数SystemInit为例进行说明:

上电后:默认使用HSI

SystemInit: 倘若调用了函数SetSysClockTo72,将启用外部晶振HSE,并将系统时钟设置到72MHz。

附SetSysClockTo72函数代码


/**

  * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2 

  *         and PCLK1 prescalers. 

  * @note   This function should be used only after reset.

  * @param  None

  * @retval None

  */

static void SetSysClockTo72(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    

  /* Enable HSE */    

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

 

  /* Wait till HSE is ready and if Time out is reached exit */

  do

  {

    HSEStatus = RCC->CR & RCC_CR_HSERDY;

    StartUpCounter++;  

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));


  if ((RCC->CR & RCC_CR_HSERDY) != RESET)

  {

    HSEStatus = (uint32_t)0x01;

  }

  else

  {

    HSEStatus = (uint32_t)0x00;

  }  


  if (HSEStatus == (uint32_t)0x01)

  {

    /* Enable Prefetch Buffer */

    FLASH->ACR |= FLASH_ACR_PRFTBE;


    /* Flash 2 wait state */

    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    


 

    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

      

    /* PCLK2 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    

    /* PCLK1 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;


#ifdef STM32F10X_CL

    /* Configure PLLs ------------------------------------------------------*/

    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */

    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

        

    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |

                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |

                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

  

    /* Enable PLL2 */

    RCC->CR |= RCC_CR_PLL2ON;

    /* Wait till PLL2 is ready */

    while((RCC->CR & RCC_CR_PLL2RDY) == 0)

    {

    }

    

   

    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 

    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 

                            RCC_CFGR_PLLMULL9); 

#else    

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

                                        RCC_CFGR_PLLMULL));

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

#endif /* STM32F10X_CL */


    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;


    /* Wait till PLL is ready */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }

    

    /* Select PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    


    /* Wait till PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

    {

    }

  }

  else

  { /* If HSE fails to start-up, the application will have wrong clock 

         configuration. User can add here some code to deal with this error */

  }

}


关键字:STM32  系统时钟 引用地址:STM32系统时钟

上一篇:STM32库函数实现方法
下一篇:STM32的FSMC总线驱动ili9341,掉电重启无法正常显示的问题

推荐阅读最新更新时间:2026-03-20 07:11

STM32时钟系统及配置方法
什么是时钟 单片机如果要正常运行,时钟信号是必不可少的。作为CPU的脉搏,时钟的快慢决定了CPU的运行速率,执行指令的速度。一般时钟源会被分频器或倍频器分成多种频率的时钟,以满足系统的不同应用。 那么时钟信号是怎么产生的呢? 晶振 在石英晶体上按一定方位切下薄片,将薄片两端抛光并涂上导电的银层,再从银层上接出两个电极并封装起来的元件叫石英晶体谐振器,简称石英晶体。采用石英晶体的振荡器称为晶体振荡器,简称晶振。 晶体本身不能产生振荡信号,必须借助于外部的振荡器电路。另外振荡器件除了是晶振外,还可以是RC振荡电路,或者LC振荡电路。 晶体振荡器分为无源晶振和有源晶振两种类型,无源晶振英文叫做crystal(晶体),而有源晶振则叫做
[单片机]
stm32的RCC系统时钟配置
一直以来,我使用的系统时钟都是默认设置,没有经过修改,也一直能用,但是一直不清楚如何一步步配置,现在知道怎么改了,所以把修改的方法写下来供参考。 很全很细的介绍请看这里 https://wenku.baidu.com/view/3c11ec1925c52cc58bd6bed8.html 想复制一下,随便改改就能用请看下面。重点是注释 首先贴我从野火f103抄来的,经过修改的代码 1 void HSE_SetSysClockTo72(void) 2 { 3 __IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0; 4 5 // 把RCC外设初始化成
[单片机]
STM32时钟系统之利用 systick 定时器来实现准确的延时
  本篇文章带着大家来认识一下 STM32 的时钟系统,以及利用 systick 定时器来实现一个比较准确的延时。   我们首先从时钟说起,时钟在MCU中的作用,就好比于人类的心脏一样不可或缺。STM32 的时钟相比 51 的单一时钟要复杂些,它有多个时钟源可以使用,那么大家可能会有所疑惑,STM32 的时钟搞的那么复杂干什么,原因其实在于,STM32的外设资源比起51来说,是很丰富的,那么不同外设使用的时钟也会不一样,同时我们要知道时钟越快,功耗就越大,抗电磁干扰的能力就会减弱,因此,比较复杂的MCU 都会采用多时钟来解决这些问题。   那么,这个时钟系统究竟是什么呢??   这里给大家简单总结了下:STM32 共有 5个时钟源
[单片机]
<font color='red'>STM32</font><font color='red'>时钟</font><font color='red'>系统</font>之利用 systick 定时器来实现准确的延时
stm32系统架构及其时钟系统
1 系统组成 八个单元----4主动,4被动,主动或被动单元与总线矩阵有关。 2 时钟信号处理模式 3 时钟设计 3.1 时钟源分类 3.1.1RC时钟 RC时钟其特点是精度低,但体积小,因此经常被单片机作为内置时钟 3.1.2 OSC时钟 osc时钟与RC正好相反,即更高的精度与更大的体积,在需要高精度时钟信号的场景中作为外接时钟接入 4 选择器开关 4.1 作用 他的作用为选择时钟信号由它来绝定何种时钟信号可以通过,下图中用绿线标出 4.2分频器 4.2.1预分频器 预分频器对时钟信号进行预分频 4.2.2倍频器 5 控制器(与门)
[单片机]
STM32系统时钟配置
STM32的SYSCLK(系统时钟)可由三种不同的时钟源来驱动,分别是HSI振荡器时钟、HSE振荡器时钟、PLL时钟。这些设备还拥有2种二级时钟源: 1、低速内部RC(LSI RC)振荡器,频率在30~60KHZ之间变化,为了方便计算我们一般估算为40KHZ,它主要为独立看门狗提供时钟源,或通过相关寄存器配置驱动RTC(RTCCLK),用于从停机/待机模式下自动唤醒系统。 2、使用32.768KHZ的低速外部晶体时钟来驱动RTC(RTCCLK)。 为减小功耗,STM32的任一时钟源都可以独立地开启或关闭。 注意:1、当HSI(高速内部时钟)作为PLL时钟输入时,SYSCLK得到的最大频率为36MHZ(有些写的是64MHZ)。SD
[单片机]
<font color='red'>STM32</font><font color='red'>系统</font><font color='red'>时钟</font>配置
基于STM32时钟系统的开发及配置
一、背景 最近做个项目,需要使用STM32,还是以前一样的观点,时钟就是MCU心脏,供血即时钟频率输出,想要弄明白一个MCU,时钟是一个非常好的切入点。言归正传,网上已经有太多大神详述过STM32的详细配置方法了,在此就简单介绍下STM32时钟系统,以及如何配置做个简单记录,方便以后的快速开发。 二、正文 废话不多说,上一张STM32F10xx的时钟树图: 由图可知,STM32F10XX有两级时钟 第一级时钟 * 高速内部时钟(HSI) * 锁相环时钟(PLLCLK) * 高速外部时钟(HSE) 第二级时钟 * 低速内部时钟(LSI) * 低速外部时钟(LSE) 又由图可知, * HSE由外部晶振从“OSC_OUT”,“
[单片机]
基于<font color='red'>STM32</font><font color='red'>时钟</font><font color='red'>系统</font>的开发及配置
STM32时钟系统详解
1. STM32的时钟源主要有: 内部时钟 外部时钟 锁相环倍频输出时钟 1.1 详细介绍 HSI(内部高速时钟) 它是RC振荡器,频率可以达到8MHZ,可作为系统时钟和PLL锁相环的输入。 HSE(外部高速时钟) 接入晶振范围是4-16MHZ,可作为系统时钟和PLL锁相环的输入,还可以经过128分频之后输入给RTC。 LSI(内部低速时钟) 它是RC振荡器,频率大概为40KHZ,供给独立看门狗或者RTC,并且独立看门口只能依靠LSI作为时钟源。 LSE(外部低速时钟) 通常外接32.768MHZ晶振提供给RTC。 PLL(锁相
[单片机]
<font color='red'>STM32</font><font color='red'>时钟</font><font color='red'>系统</font>详解
STM32入门系列-STM32时钟系统STM32时钟
时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道STM32属于高级单片机,其内部有很多的外设,但不是所有外设都使用同一时钟频率工作,比如内部看门狗和RTC,它只需30KHz的时钟频率即可工作,所以内部时钟源就有多种选择。在前面章节的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,将STM32F1系统时钟设置为72MHz,然后进入主函数。那么这个系统时钟大小如何得来,其他外设的时钟又如何划分,可以通过一张时钟树图找到答案,只要理解好时钟树,STM32一切时钟的来龙去脉就会非常清楚。下面就来了解下时钟
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved