通俗易懂STM32中的时钟树
-
- 1 本文的目标
- 2 什么是时钟信号?
- 3 时钟信号是如何产生的?
- 4 时钟信号有几种
-
- 4.1 输入时钟
-
- (1)高速外部时钟
- (2) 高速内部时钟
- (3)低速外部时钟
- (4) 低速内部时钟
- 4.2 系统时钟
- 4.3 其他时钟
- 5 why so complication?
1 本文的目标
?
2 什么是时钟信号?
?
?时钟信号是一种特殊类型的信号,它在高低状态之间振荡,并像节拍器一样用来协调电路的动作。
3 时钟信号是如何产生的?
?之前写的这篇文章略有设计:在 keil 建立基于STM32开发的工程模板–详细步骤
4 时钟信号有几种
STM32Fl03 相关时钟 可分为以下几类 3 种: 输入时钟 系统时钟 其他时钟:系统时钟分频
4.1 输入时钟
?STM32Fl03 的 不同的时钟源可以输入时钟。 ? ?高速时钟为 STM32Fl03 的提供时钟信号,
?只有低速时钟 (Real Time Clock, ) 和(Independent Watch Dog, )提供时钟信号。
?从芯片的角度来看,可分为内部时钟(片内时钟)和外部时钟源(片外时钟)。内部时钟由芯片内部组成 RC振荡器产生,振动快,所以系统主时钟默认使用内部高速时钟。外部时钟通常由外部晶体振动输入,在精度和稳定性方面具有很大的优势。 ?因此,主时钟通常在上电后通过软件配置转换为外部高速时钟信号。
(1)高速外部时钟
?高速外部时钟 (High Speed External clock signal, HSE)晶振频通常以外部晶振为时钟源 可取率范围为 4 ~ 16MHz, ST 选择官方推荐 8MHz 作为外部晶振 STM32Fl03 微控制器的 HSE。
?以下是外接8MHz以高速外部时钟为例,晶振沿下图STM32F介绍103时钟树STM32F103时钟系统是如何从高速外部时钟(8MHz开始逐步获得系统时钟SYSCLK。
从最左端的 osc_IN 和 OSC_ OUT 开 始, STM32Fl03 这两个引脚分别连接到 8MHz 外晶振的两端。
8M 的 HSE 遇到多路选择器 PLLXTPRE(HSE divider for PLL entry)。 寄存器可以通过编程配置选择 PLLXTPRE的输出 : 二分频或不分频输入时钟。 通常选择不分频,所以经过 PLLXTPRE 之后,输出仍然是 8MHz 时钟信号。
8MHz的HSE遇到多路选择器PLLSRC (PLL entry clock source)。 同 样品可以通过配置寄存器来选择PLLSRC 高速外部时钟的输出HSE或高速内部时钟 HSI。 通常选择高速外部时钟输出HSE。
8MHz的HSE遇到锁相环CPLL ),经过PLL 之后,输出时钟被称为PLLCLK。 通 过配置PLL 选择倍频系数 PLLMUL (PLL mul tipli cation factor),可以决定 PLLCLK输出频率。 通常,为了使用STM32Fl03满频工作,通常将倍频系数设置为9。 于是,经过PLL后,原来8MHz的时钟HSE变成了72MHz的时钟PLLCLK。
72MHz的PLLCLK遇到多路选择器SW。 可以选择配置寄存器SW输 出为PLLCLK、HSE或HSI。 SW输出就是STM32Fl03的系统时钟SYSCLK,通常选 择PLLCLK作为SW输出。 因此,STM32Fl03的系统时钟SYSCLK 为72MHz。
(2) 高速内部时钟
高速内部时钟(High Speed Internal clock signal, HSI)由片内RC振荡器产生频率 为8MHz,但不稳定。 STM32Fl03从上电开始使用HSI作为初始系统时钟。
(3)低速外部时钟
低速外部时钟(Low Speed External clock signal , LSE)通常以外部晶振为时钟源, 实时钟模块主要提供,因此一般采用32. 768 kHz。
(4) 低速内部时钟
低速内部时钟(Low Speed Internal clock signal, LSI)由片内RC产生振荡器,是的 以40频率提供实时钟模块和看门狗模块 kHz。
4.2 系统时钟
?从上可知,系统时钟SYSCLK 多路选择器SW根据用户设置选择PLLCLK、HSE或HSI一路输出。 SYSCLK最高频率可达72MHz(通常在72工作MHz), 是STM32Fl03大部分 零件时钟来源。
?通常,STM32Fl03从上电开始 ,选用HSI作为初始系统时钟。 初始化完成后,一般选择更稳定可靠的HSE作为系统时钟的来源。为使用户能够实时检测时钟系统是否正常运行,ST 在STM32Fl03 该系列微控制器专门提供引脚MCO(M ai nC lock Output,主时钟输出)。 用户可以通过软件编程选择SYSCLK、PLLCLK、HSE或HSI中的一路在MCO上输出。
4.3 其他时钟
?
? 高速总线AHB系统时钟SYSCLK 经AHB直接获得预分频器。 通常, 将AHB预分频系数设置为1,HCLK即 为72MHz,最高 也为72MHz。 。 由此可见, 。
? Cortex-M3内核的 “自由运行” 时钟也由系统时钟制成SYSCLK经AHB直接获得预分频器。 它与HCLK同步,最大 也 是72MHz。 所谓不来自 HCLK 。 因 此在HCLK停止时FCLK还能继续运行。 这样 ,可以保证即使在Cortex-M内核睡眠也可以采样到中断和跟踪休眠事件。
? 外设时钟,系统时钟SYSCLK经AHB预分频器,再经APBl预分频器后得到。 一般情况下,会AHB将预分频系数设置为1APB1 预分频系数设置为2, PCLK1为挂载在APB1 总线外设提供时钟信号,如等。类似地,如需使用以上挂载在APB2总线上的外设,必须先开启APB2总线上该外设的时钟。
外设时钟,由系统时钟SYSCLK经AHB预分频器,再经APB2预分频器后得到。 通常情况下 ,将AHB预分频系数和APB2的预分频系数都设置为1,,它的最大频率也为72MH 。PCLK2为挂载在APB2总线上的外设提供时钟信号,如等。 尤其需要注意的 是,如需使用以上 挂载在APB2总线上的外设 ,必须先开启APB2总线上该外设的时钟。
SDIO外设的时钟,由系统时钟SYSCLK经AHB预分频器后直接得 SDI 到。 类似地,如需使用SDIO外设,必须先开启SDIOCLK 。 可变静态存储控制器的时钟,由系统时钟SYSCLK经AHB预分频器 后直接得到。类似地 ,如需使用 FSMC外接存储器,必须先开启FSMCCLK 。
的外部时钟源,由系统时钟SYSCLK 经 AHB 预分频器,再经过 8分频后得到, 等千。除了外部时钟源 STCLK , 系 统定时器SYSTICK还可以将FCLK作为内部时钟源 。
,由APBl总线上的时钟PCLK1 经 过倍频后得到。 类似地,如需使用定时器 2到定时器 7 中的任意一个或多个,必须先开 启APB2总线上对应的定时器时钟。
的内部时钟源,由APB2总线上的时钟PCLK2经 过倍频后得到。 类似地,如需使用定时器1或定时器8 ,必须先开启APBl总线上定时器 1或定时器8的时钟。
ADC1、ADC2、ADC3的时钟, 由APB2总线上的时钟 PCLK2 经 ADC 预分频器得到。 ADCCLK最大为14MHz。
5 why so complication?
最后,为什么STM32Fl03的时钟系统 会显得如此复杂呢?因为有倍频、分频和一系列外设时钟的开关。 首先,倍频是考虑到电磁兼容性,如果直接外接一个 72MHz的晶振, 过高的振荡频率会给制作电路板带来难度。 其次,分频是因为STM32Fl03各个片上外设的工作频率不尽相同,既有高速外设又有 低速外设, 需要把高速外设和低速外设分开管理。 最后,每个 STM32F103外设都配备了时钟开关。 当使用某个外设时, 一定要打开该外设的时钟;而当不使用某个外设时,可以把这个外设时钟关闭,从而降低STM32的整体功耗。