目录一、什么是时钟树二、时钟频率和时钟树三、STM32F10x系统时钟SYSCLK1. 高速内部时钟HSI2. 高速外部时钟HSE3. 低速内部时钟LSI4. 低速外部时钟LSE四、启动文件中的SystemInit函数一、什么是时钟树时钟就好比单片机的心跳时钟信号通常是一种特定频率的方波是所有模块的工作同步节拍所有外设必须按照节拍器的节奏同步工作否则会出现混乱。时钟不仅能用于提供同步还是CPU以及其他外设模块运行的关键。在这些模块中有着一系列的基本电路触发器、寄存器、ALU、控制器等。时钟信号进入CPU后首先是给到了触发器然后由触发器向下游的寄存器、控制器等其他电路输出信号引起下游电路工作。简单总结一下时钟信号有两个方面的作用1.触发电路工作2.保证同步性二、时钟频率和时钟树时钟频率时钟频率往往指的是晶振每秒震动的次数比如一个晶振为1MHz那么一秒钟内时钟信号就有1M次变化高低电平变化。而从上面的图中我们可以看到CPU在时钟信号下读取指令并运行。换句话说时钟频率越高CPU从falsh读取指令的速率越快性能也就越高。当然这也不是唯一因素。比如CPU的ALU运行也是需要时间的且现代CPU有一些优化手段使得不同架构但是相同频率的时钟的CPU性能也会大大不同。时钟周期时钟周期是时钟频率的倒数。他是计算机执行指令的最基本时间单元因为所有的处理器都需要根据时钟进行运算。机器周期机器周期是CPU执行一条指令所需的时间。往往是多个时钟周期组成。这是因为CPU执行一条指令往往需要多个步骤读取指令、指令解析、指令执行运算等而一个时钟周期只能让一个小模块运作起来所以一个完整的指令执行需要多个时钟周期。在现代处理器架构中不同架构执行一条指令所需要的时钟周期都不相同。时钟树STM32芯片有许多的外设但是每一个外设所需要的时钟频率不尽相同但是我们的晶振只能产生一种频率的时钟信号所以需要对该信号进行分频、倍频处理然后通过时钟线如APB1、AHB等传递给不同外设。时钟线错综复杂但是一定是分支结构的就好像树的树枝一样所以称为时钟树。三、STM32F10x系统时钟SYSCLKSTM32F10的四种主要时钟源包括高速内部时钟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上默认只会开启核心部分的时钟。如果你需要使用一些外设首先就要开启外设时钟连接电路到时钟树中。简图如下在这幅图中可以看到HSE和LSE是分开的一棵小的时钟树和一棵大的时钟树。其中小树连接的是RTC实时时钟以及IWDG看门狗模块这是因为他们对于时钟频率的要求很低用高频时钟也是浪费所以干脆配一个低频时钟就够用了。刚刚我们看了SYSCLK时钟的由来下面我们再来看看产生了SYSCLK后又发生了什么又有哪些模块挂载到AHB总线上1USB时钟和I2S2、SDIO、FMSC可以看到是挂载在AHB预分频器之前的这种方式能让这些核心外设和AHB总线时钟解耦减少了时钟信号之间的潜在冲突使得USB等时钟能够保持稳定。2内核时钟HCLK可以看到是直接挂载到AHB总线上的因为其时钟频率越高性能越好自然是要使用STM32能提供的最高时钟频率。3APB2和APB1往往是需要经过AHB时钟分频得到的。APB2和APB3作为微控制器的外设总线它们连接的外设种类和数量可能不同。某些外设可能需要更高的时钟频率以实现更快速的数据传输或处理而另一些外设则可能不需要那么高的频率。因此系统设计时会根据外设的需求来分配不同的时钟频率。四、启动文件中的SystemInit函数在system_stm32f10x.h文件中可以看到他有以下两个函数这两个函数都是用来配置时钟的。其中第一个是会在启动文件中自动调用的而第二个则需要用户在运行过程中如果切换了时钟分频如9分配变为不分频、或者切换了时钟源如从HSI变为HSE之后SystemCoreClock这个变量的值可能不再准确需要调用第二个函数更新该变量。该变量会被一些库函数使用用于计算时间间隔如果时钟不准确其行为难以预测如果需要自己手动配置SYSCLK等还是一件比较复杂的事情需要查阅文档后谨慎操作好在ST公司提供的启动文件已经帮我们做好了。只不过SystemInit默认是把时钟都配置成最高速度运行以达到STM32的最佳性能。不过如果你想做低功耗可能需要自己再手动修改配置时钟频率。在STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h路径下通常能看到RCC时钟相关的所有配置函数。但作为一个工程师肯定无法掌握所有所以建议大家随用随查。下面将主要的列举出来。
STM32时钟树
目录一、什么是时钟树二、时钟频率和时钟树三、STM32F10x系统时钟SYSCLK1. 高速内部时钟HSI2. 高速外部时钟HSE3. 低速内部时钟LSI4. 低速外部时钟LSE四、启动文件中的SystemInit函数一、什么是时钟树时钟就好比单片机的心跳时钟信号通常是一种特定频率的方波是所有模块的工作同步节拍所有外设必须按照节拍器的节奏同步工作否则会出现混乱。时钟不仅能用于提供同步还是CPU以及其他外设模块运行的关键。在这些模块中有着一系列的基本电路触发器、寄存器、ALU、控制器等。时钟信号进入CPU后首先是给到了触发器然后由触发器向下游的寄存器、控制器等其他电路输出信号引起下游电路工作。简单总结一下时钟信号有两个方面的作用1.触发电路工作2.保证同步性二、时钟频率和时钟树时钟频率时钟频率往往指的是晶振每秒震动的次数比如一个晶振为1MHz那么一秒钟内时钟信号就有1M次变化高低电平变化。而从上面的图中我们可以看到CPU在时钟信号下读取指令并运行。换句话说时钟频率越高CPU从falsh读取指令的速率越快性能也就越高。当然这也不是唯一因素。比如CPU的ALU运行也是需要时间的且现代CPU有一些优化手段使得不同架构但是相同频率的时钟的CPU性能也会大大不同。时钟周期时钟周期是时钟频率的倒数。他是计算机执行指令的最基本时间单元因为所有的处理器都需要根据时钟进行运算。机器周期机器周期是CPU执行一条指令所需的时间。往往是多个时钟周期组成。这是因为CPU执行一条指令往往需要多个步骤读取指令、指令解析、指令执行运算等而一个时钟周期只能让一个小模块运作起来所以一个完整的指令执行需要多个时钟周期。在现代处理器架构中不同架构执行一条指令所需要的时钟周期都不相同。时钟树STM32芯片有许多的外设但是每一个外设所需要的时钟频率不尽相同但是我们的晶振只能产生一种频率的时钟信号所以需要对该信号进行分频、倍频处理然后通过时钟线如APB1、AHB等传递给不同外设。时钟线错综复杂但是一定是分支结构的就好像树的树枝一样所以称为时钟树。三、STM32F10x系统时钟SYSCLKSTM32F10的四种主要时钟源包括高速内部时钟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上默认只会开启核心部分的时钟。如果你需要使用一些外设首先就要开启外设时钟连接电路到时钟树中。简图如下在这幅图中可以看到HSE和LSE是分开的一棵小的时钟树和一棵大的时钟树。其中小树连接的是RTC实时时钟以及IWDG看门狗模块这是因为他们对于时钟频率的要求很低用高频时钟也是浪费所以干脆配一个低频时钟就够用了。刚刚我们看了SYSCLK时钟的由来下面我们再来看看产生了SYSCLK后又发生了什么又有哪些模块挂载到AHB总线上1USB时钟和I2S2、SDIO、FMSC可以看到是挂载在AHB预分频器之前的这种方式能让这些核心外设和AHB总线时钟解耦减少了时钟信号之间的潜在冲突使得USB等时钟能够保持稳定。2内核时钟HCLK可以看到是直接挂载到AHB总线上的因为其时钟频率越高性能越好自然是要使用STM32能提供的最高时钟频率。3APB2和APB1往往是需要经过AHB时钟分频得到的。APB2和APB3作为微控制器的外设总线它们连接的外设种类和数量可能不同。某些外设可能需要更高的时钟频率以实现更快速的数据传输或处理而另一些外设则可能不需要那么高的频率。因此系统设计时会根据外设的需求来分配不同的时钟频率。四、启动文件中的SystemInit函数在system_stm32f10x.h文件中可以看到他有以下两个函数这两个函数都是用来配置时钟的。其中第一个是会在启动文件中自动调用的而第二个则需要用户在运行过程中如果切换了时钟分频如9分配变为不分频、或者切换了时钟源如从HSI变为HSE之后SystemCoreClock这个变量的值可能不再准确需要调用第二个函数更新该变量。该变量会被一些库函数使用用于计算时间间隔如果时钟不准确其行为难以预测如果需要自己手动配置SYSCLK等还是一件比较复杂的事情需要查阅文档后谨慎操作好在ST公司提供的启动文件已经帮我们做好了。只不过SystemInit默认是把时钟都配置成最高速度运行以达到STM32的最佳性能。不过如果你想做低功耗可能需要自己再手动修改配置时钟频率。在STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h路径下通常能看到RCC时钟相关的所有配置函数。但作为一个工程师肯定无法掌握所有所以建议大家随用随查。下面将主要的列举出来。