目录
[1. 高速内部时钟(HSI)](#1. 高速内部时钟(HSI))
[2. 高速外部时钟(HSE)](#2. 高速外部时钟(HSE))
[3. 低速内部时钟(LSI)](#3. 低速内部时钟(LSI))
[4. 低速外部时钟(LSE)](#4. 低速外部时钟(LSE))
一、什么是时钟树
时钟就好比单片机的心跳,时钟信号通常是一种特定频率的方波,是所有模块的工作同步节拍,所有外设必须按照节拍器的节奏同步工作,否则会出现混乱。
时钟不仅能用于提供同步,还是CPU以及其他外设模块运行的关键。在这些模块中有着一系列的基本电路:触发器、寄存器、ALU、控制器等。时钟信号进入CPU后首先是给到了触发器,然后由触发器向下游的寄存器、控制器等其他电路输出信号,引起下游电路工作。

简单总结一下:时钟信号有两个方面的作用:
1.触发电路工作
2.保证同步性
二、时钟频率和时钟树
时钟频率
时钟频率往往指的是晶振每秒震动的次数,比如一个晶振为1MHz,那么一秒钟内时钟信号就有1M次变化(高低电平变化)。而从上面的图中我们可以看到,CPU在时钟信号下读取指令并运行。换句话说时钟频率越高,CPU从falsh读取指令的速率越快,性能也就越高。当然,这也不是唯一因素。比如CPU的ALU运行也是需要时间的,且现代CPU有一些优化手段,使得不同架构但是相同频率的时钟的CPU性能也会大大不同。
时钟周期
时钟周期是时钟频率的倒数。他是计算机执行指令的最基本时间单元,因为所有的处理器都需要根据时钟进行运算。
机器周期
机器周期是CPU执行一条指令所需的时间。往往是多个时钟周期组成。这是因为CPU执行一条指令往往需要多个步骤:读取指令、指令解析、指令执行运算等,而一个时钟周期只能让一个小模块运作起来,所以一个完整的指令执行需要多个时钟周期。在现代处理器架构中,不同架构执行一条指令所需要的时钟周期都不相同。
时钟树:
STM32芯片有许多的外设,但是每一个外设所需要的时钟频率不尽相同,但是我们的晶振只能产生一种频率的时钟信号,所以需要对该信号进行分频、倍频处理,然后通过时钟线(如APB1、AHB等)传递给不同外设。
时钟线错综复杂,但是一定是分支结构的,就好像树的树枝一样,所以称为时钟树。
三、STM32F10x系统时钟SYSCLK
STM32F10的四种主要时钟源包括:高速内部时钟(HSI)、高速外部时钟(HSE)、低速内部时钟(LSI)和低速外部时钟(LSE)。以下是对这四种时钟的详细讲解:
1. 高速内部时钟(HSI)
- 来源:HSI是STM32F10内部集成的RC振荡器产生的时钟信号。
- 频率:通常为8MHz,但可以通过PLL(锁相环)进行倍频以提高系统时钟频率。
- 特点:HSI时钟在芯片上电后即可立即使用,无需外部元件,适用于对时钟精度要求不高的场合。
- 应用:常用于系统启动时的默认时钟源,以及在HSE不可用时的备用时钟源。
2. 高速外部时钟(HSE)
- 来源:HSE是外部提供的时钟信号,通常通过晶体振荡器或陶瓷谐振器产生。
- 频率:HSE的频率范围通常为4MHz至16MHz,具体频率取决于所使用的外部晶体或谐振器。
- 特点:HSE时钟具有较高的精度和稳定性,适用于对时钟精度要求较高的应用。
- 应用:常作为系统时钟的主要来源,通过PLL倍频后提供给CPU和其他高速外设使用。
3. 低速内部时钟(LSI)
- 来源:LSI是STM32F10内部集成的另一个RC振荡器产生的时钟信号,专门用于低功耗模式下的时钟需求。
- 频率:通常为40kHz左右,具体频率可能因芯片型号和工艺而异。
- 特点:LSI时钟的精度较低,但功耗也相对较低,适用于对时钟精度要求不高但需要低功耗的场合。
- 应用:常用于独立看门狗(IWDG)和RTC(实时时钟)的时钟源,以及在低功耗模式下维持系统基本功能的时钟需求。
4. 低速外部时钟(LSE)
- 来源:LSE是外部提供的低速时钟信号,通常通过32.768kHz的晶体振荡器产生。
- 频率:固定为32.768kHz,这是为了与RTC的计时需求相匹配。
- 特点:LSE时钟具有极高的精度和稳定性,适用于需要精确计时的应用。
- 应用:专门用于RTC的时钟源,提供精确的时间基准,以实现日历、闹钟和定时功能。

为了减少功耗,STM32上默认只会开启核心部分的时钟。如果你需要使用一些外设,首先就要开启外设时钟(连接电路到时钟树中)。
简图如下:

刚刚我们看了SYSCLK时钟的由来,下面我们再来看看产生了SYSCLK后,又发生了什么?又有哪些模块挂载到AHB总线上?

(1)USB时钟和I2S2、SDIO、FMSC可以看到是挂载在AHB预分频器之前的,,这种方式能让这些核心外设和AHB总线时钟解耦,减少了时钟信号之间的潜在冲突,使得USB等时钟能够保持稳定。
(2)内核时钟HCLK可以看到是直接挂载到AHB总线上的,因为其时钟频率越高,性能越好,自然是要使用STM32能提供的最高时钟频率。
(3)APB2和APB1往往是需要经过AHB时钟分频得到的。APB2和APB3作为微控制器的外设总线,它们连接的外设种类和数量可能不同。某些外设可能需要更高的时钟频率以实现更快速的数据传输或处理,而另一些外设则可能不需要那么高的频率。因此,系统设计时会根据外设的需求来分配不同的时钟频率。
四、启动文件中的SystemInit函数
在system_stm32f10x.h文件中可以看到他有以下两个函数,这两个函数都是用来配置时钟的。其中第一个是会在启动文件中自动调用的,而第二个则需要用户在运行过程中如果切换了时钟分频(如9分配变为不分频)、或者切换了时钟源(如从HSI变为HSE)之后,SystemCoreClock这个变量的值可能不再准确,需要调用第二个函数更新该变量。(该变量会被一些库函数使用,用于计算时间间隔,如果时钟不准确,其行为难以预测)



如果需要自己手动配置SYSCLK等,还是一件比较复杂的事情,需要查阅文档后谨慎操作,好在ST公司提供的启动文件已经帮我们做好了。