STM32 - 系统时钟树分析
我在刚开始接触STM32的时候看到它的时钟系统/时钟树
,都会感觉有点复杂、乱乱懵懵的:
这是个什么?它想要告诉我什么?我应该怎么学习?
幸好一开始有学院的学长带着我们了解了一下,自己也在相关网站上查了一查,特此记录一下。
导读
我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳!而心脏对于人体好比时钟对于MCU。
微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。
时钟频率决定运算速度!
在数字电路中,通常由12个上升沿触发一次操作,如果要单片机执行一条汇编指令则需要若干次操作,即需要若干机器周期。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树
。
❓Q:在STM32中每个外设都有其单独的时钟,在使用某个外设之前必须打开该外设的时钟,为什么要这么麻烦来设置每一个外设的时钟而不是将所有外设的时钟统一打开?
❗A:因为STM32的外设繁多,外设的运作所需要的最佳时钟各不相同 ,如果所有时钟同时运行会给MCU带来极大的负载,所以STM32采取自助餐式的时钟管理方式:随用随开。
· 认识STM32的时钟管理方式后就要对其时钟树系统有一个大体的掌握,时钟树系统的结构如下,从图中也可以知晓有多少时钟、时钟速度为多少、时钟如何分配等:
正文
这里要先区分一些时钟系统、系统时钟、时钟源、分/倍频器、外设的概念:
概念 | 解释 |
---|---|
时钟系统 | 这整个包含时钟源、系统时钟的系统 |
时钟源 | 产生一定频率的时钟 |
系统时钟 | 由时钟源驱动的一个时钟 |
分频器 | 通过分频电路,将输入信号的频率按倍数进行降低后再输出 |
倍频器 | 通过分频电路,将输入信号的频率按倍数进行提高后再输出 |
外设 | 外部连接设备 |
· 五个时钟源
时钟源名称 | 功能释义 |
---|---|
低速内部时钟(LSI) | 由内部RC振荡器产生,主要提供给实时时钟模块 一般采用40KHz |
低速外部时钟(LSE) | 以外部晶振作为时钟源,主要提供给实时时钟模块 一般采用32.768KHz |
高速外部时钟(HSE) | 以外部晶振作为时钟源,频率范围为4~26MHz(一般选择8MHz) HSE也可以直接作为系统时钟或者PLL输入 |
高速内部时钟(HSI) | 由内部RC振荡器产生,频率为8MHz,但不稳定 可以直接作为系统时钟或者用作PLL输入 |
锁相环倍频输出(PLL) | 它是由HSE或者HSI驱动产生的一个时钟 先经过分频器M,再经过倍频器N,再经过分频器P,形成PLL时钟源,供给外设或者系统时钟使用 PLL计算公式 : x = (f/m)*(n/p) |
其中PLL计算公式各参数解释如下:
参数 | 释义 |
---|---|
x | PLL频率 |
f | 输入时钟源(HSL、HSI)时钟频率 |
p | 分频器 |
n | 倍频器 |
其中高速时钟(HSE和HSI)提供给芯片主体的主时钟,低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用。
· STMCUBEMX时钟设置
时钟名 | 功能释义 |
---|---|
BYPASS Clock Source (旁路时钟源) |
所谓HSE旁路时钟源,是指无需使用外部晶体时所需的芯片内部时钟驱动组件 直接从外界导入时钟信号,犹如芯片内部的驱动组件被旁路了。 |
Crystal/Ceramic Resonator (晶体/陶瓷晶振) |
外部晶体/陶瓷谐振器(HSE晶体)模式该时钟源是由外部无源晶体与MCU内部时钟驱动电路共同配合形成,有一定的启动时间,精度较高。 |
软件中设置如图所示:
其他
外部时钟一般由外部晶振产生,会相对比较准确一些
而系统时钟则是由时钟源驱动产生的,具体由哪个时钟源驱动,则需要看时钟框图了
可以看到,(系统时钟)SYSCLK有3路选择,HSI、HSL和PLLCLK均可以作为SYSCLK的时钟源
图中的梯形可以理解为一个选择器,3选1(同理时钟框图中的其他梯形也是同样的意思)由下图可以看出,SYSCLK出来后经过分频器,分配给AHB、APB或者其他时钟线
那么挂在这些时钟线上面的外设想要使用,就必须先使能相对应的时钟
总结
· 所以我们在拿到一款新的芯片时,查看它的时钟框图,需要重点关注这些信息:
时钟系统有哪几个时钟源,频率分别为多少
系统时钟SYSCLK可以由哪几个时钟源驱动
哪些外设分别挂在哪个时钟线或者时钟上
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。