时钟树的一些总结

前言

        时钟树为单片机及其外设提供系统时钟,以维持他们的正常运转。当然不同的外设正常工作的时钟频率也是不同的,所以为了满足不同的外设都能够以正常的状态运行,这就需要用到时钟树的配置,在时钟树里有许多种不同的配置方法,同时也有不同的时钟源,接下里就对时钟树进行展开。

1.时钟树的结构

        

        上图是时钟树的基本结构,看起来十分复杂,实际上可以分为两大部分,左边是时钟源,右边则通过一系列的操作,来使得输入外设的时钟能够得到满足。

        同时由于时钟树寄存器较多,这里就不一一单独介绍,而是在需要用到寄存器的地方最对其进行介绍。

        时钟树的时钟源有四个从上到下分别为:HSI内部低速时钟、HSE外部高速时钟、LSE外部低速时钟、LSI内部低速时钟,其中还包含PLL(Phase-Locked Loop)锁相环的时钟输出,接下来一一进行介绍。

2.时钟源

2.1数据选择器的介绍

        在介绍时钟源之前,需要对结构中的梯形结构数据选择器进行介绍,方便对后续的时钟理解。

2.1.1 PLLSRC (PLL输入时钟源)(PLL entry clock source)

        需要明确一点,数据选择器的配置都在在RCC_CFGR时钟配置寄存器中,所以接下对症下药,查看该寄存器的大致结构。

        可以看到,在这个32为的寄存器中,不均匀的分布着许多数据选择器的控制位。

        查看我们所需要的PLLSRC也就是第16位:

        该位是用来配置PLL(Phase-Locked Loop)锁相环的输入时钟源的,时钟源可以是HSI内部低速时钟经过2分频后或者HSE外部高速时钟直接作为时钟源,对PLLSRC数据选择器置0或者1来实现。

2.1.2 PLLMUL PLL倍频系数 (PLL multiplication factor)

        PLLMUL倍频系数选择器是在PLLSRC选择完输入时钟源的情况下,将输入的时钟源在PLLMUL中进行倍频操作,以此来提高系统时钟的频率输出,来满足需要高频时钟的外设。

        同样在CFGR寄存器中找到对应的位:

        该数据选择器占用了四位,也就对应16种不同的倍频输出,也就是2~16,可以注意到11101111实现的结果是一样的,因为1倍频等价位不倍频。若不倍频的化就不需要进入到PLL时钟线路中了,HSE和HSI都可以直接作为系统时钟输入源,无需多此一举,所以0000对应的就是2倍频时钟输出,而11101111实现的结果是一样的。

        通过对CFGR寄存器的位21到18进行位设置,就能够得到所需要的倍频。

        需要注意的是,PLL锁相环倍频输出的频率不能够超过72MHz,这里不需要知道原理,而我们一般用的也就是72MHz,就是通过HSE输出的8MHz经过PLL锁相环9倍频得到的72MHz系统时钟。

72MHz系统时钟源的选择

        为什么不选用HSI的8MHz来进行时钟倍频呢?

        首先,我们一般需要的是72MHz的系统时钟,而HSI需要除上2才能够进入到PLL锁相环,也就是 4MHz,经过最大倍频(16倍频)得到的系统时钟也只有64MHz,不满足72MHz。

        同时HSI内部是由RC振荡的来的时钟源,即使在校准之后它的时钟频率精度仍较差,所以使用精度更高的HSE通过9倍频来的得到72MHz系统时钟。

2.1.3 SW[1:0]系统时钟切换(System clock switch)

        然后是上图右边的带有SW字样的数据选择器,同样可以看到在寄存器的低2位SW[1:0],查找到对应的寄存器位描述:

        该选择的输入有HSI内部高速时钟、PLLCKL锁相环时钟、HSE外部高速时钟,可以通过SW数据选择器进行选择,实际上就是通过对CFGR寄存器的低2位SW[1:0]来设置的。

SW[1:0]对应选择的时钟源
00HSI作为系统时钟
01HSE作为系统时钟
10PLL作为系统时钟
11不可用

2.1.4 PLLXTPRE HSE分频器作为PLL输入 (HSE divider for PLL entry)

        接下来对PLLXTPRE数据选择器进行介绍:

        同样在寄存器中找到对应的控制位:

        这个数据选择器的针对HSE对PLL输入的控制选择,可以直接将HSE时钟输入到PLL,或是2分频后再进行输入到PLL锁相环中,如下图所示:

        同时结合前面的PLLSRC(PLL输入时钟源)若需要HSE的时钟输入,则需要先将PLLSRC位(也就是RCC_CFGR寄存器的第16位)置1,然后再对PLLXTPRE进行输入控制选择。

2.1.5 RTCSEL[1:0] RTC时钟源选择 (RTC clock source selection)

        通过查找CFGR寄存器中的位,并未找到对应的位。

        由于数据选择器的输出是RTCCLK也就是RTC时钟,所以需要在RTC时钟寄存器中寻找。

        通过设置备份域控制寄存器(RCC_BDCR)里的RTCSEL[1:0]位,RTCCLK时钟源可以由
HSE/128、LSE或LSI时钟提供。除非备份域复位,此选择不能被改变。

        

        可以看到,这是一个备份域控制寄存器,图中的注意也就是为什么这些控制位会单独出现在RCC_BDCR备份域控制寄存器中,这些位在复位后会进入写保护状态(不能写操作),只有电源控制寄存器PWR_CR中的DBP位置1才能进行写操作来改变这些位的状态。

        而RTCSEL[1:0]在该寄存器的第8和第9位中,找到对应的位描述:

        很简单,就是对RTC时钟源的选择,需要注意的是一旦通过软件设置了RTCSEL[1:0]位来选择一个RTC时钟源,这个选择就会一直保持,直到下一次后备域被复位。这意味着在正常运行期间,你不能简单地通过修改RCC_BDCR寄存器来改变RTC的时钟源。如果你确实需要更改RTC的时钟源,你需要执行以下步骤:

        1.禁用RTC:首先,你需要通过软件禁用RTC,或者至少确保在更改时钟源时RTC的操作不会受到干扰。
        2.重置后备域:通过设置RCC_BDCR寄存器中的BDRST(第16位)位来重置后备域。这将清除后备域的所有配置,包括RTC的时钟源设置。请注意,这也会导致后备寄存器和RTC(如果它正在运行)中的数据丢失。
        3.重新配置RTC:在后备域重置后,你可以重新设置RTC的时钟源和其他相关参数。

        通过对RTCSEL[1:0]位的设置,可以选择LSE、LSI或者HSE128分频后作为RTC时钟。

2.1.6 MCO 微控制器时钟输出 (Microcontroller clock output)

        最后是MCO主时钟输出,在CFGR寄存器找到对应的位:

        MCO属于单片对外的时钟输出,来源可以为PLLCLK锁相环时钟除2、HSI、HSE、SYSCLK(系统时钟),对MCO进行位设置即可实现选择时钟操作。

        以上是对时钟树的数据选择器进行描述,接下来对时钟源进行展开。

2.2内部低速时钟HSI(High-Speed Internal Clock)

                      

        HSI时钟信号由内部 8MHzRC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入,也就是HSI时钟信号的两条输出路线。
        HSI的RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。
       

2.3外部高速时钟HSE(High-Speed External Clock)

        高速外部时钟信号(HSE)由以下两种时钟源产生:
        ● HSE外部晶体/陶瓷谐振器
        ● HSE用户外部时钟
        为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠近振荡器引脚。负载电容值必须根据所选择的振荡器来调整。
        
        下图是具体的硬件电路:
       

        同时对外部时钟源和警惕谐振器又有要求:
        
        外部时钟源(HSE 旁路 )
        在这个模式里,必须提供外部时钟。它的频率最高可达25MHz 。用户可通过设置在时钟控制寄存器中的HSEBYP HSEON 位来选择这一模式。外部时钟信号 (50% 占空比的方波、正弦波或
三角波 ) 必须连到 SOC_IN 引脚,同时保证 OSC_OUT 引脚悬空。见图 9
        外部晶体/ 陶瓷谐振器 (HSE 晶体 )
        4~16Mz外部振荡器可为系统提供更为精确的主时钟。相关的硬件配置可参考图 9 ,进一步信息可参考数据手册的电气特性部分。
        在时钟控制寄存器RCC_CR 中的 HSERDY 位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置’1’ ,时钟才被释放出来。如果在时钟中断寄存器 RCC_CIR 中允许产生中断,
将会产生相应中断。
        HSE晶体可以通过设置时钟控制寄存器里 RCC_CR 中的 HSEON 位被启动和关闭。
       
        PLL、HSE和HSI时钟在作为时钟输入的时候,都会被时钟控制寄存器RCC_CR中的XXX RDY 位用来指示高速外部振荡器是否稳定,直到指定位为1才释放时钟。
        
        
        其中包含 PLLRDY、HSERDY、HSIRDY,三个是时钟源释放的控制端,置1时,时钟源才会释放进入到单片机中。
        
        同时该寄存器也包含使能 CSS时钟安全系统、PLL锁相环、HSE外部高速时钟、HSI内部高速时钟的使能位,这里自行对照了解不对其进行深究。

2.4外部低速时钟LSE(Low-Speed External Clock)

        LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。

        LSE晶体通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭。
        在备份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶体振荡是否稳定。在启动阶段,直到这个位被硬件置’1’后,LSE时钟信号才被释放出来。如果在时钟中断寄存器里被允许,可产
生中断申请。
        外部时钟源(LSE 旁路 )
        在这个模式里必须提供一个32.768kHz 频率的外部时钟源。你可以通过设置在备份域控制寄存器(RCC_BDCR)里的LSEBYPLSEON位来选择这个模式。具有50%占空比的外部时钟信号(
波、正弦波或三角波)必须连到OSC32_IN引脚,同时保证OSC32_OUT引脚悬空,见下图
        LSE单纯的提供时钟给RTCCLK实时时钟,所以对LSE的精度要求较高,一般也选用LSE作为RTC的时钟来源。
        通过上图可以直到,PC14和P15端口上接着LSE的时钟输入,硬件结构图如下

2.5内部低速时钟LSI(Low-Speed Internal Clock)

        LSI RC振荡时钟担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行为 独立看门狗IDWWG 自动唤醒单元提供时钟 。LSI 时钟频率大约 40kHz( 30kHz 60kHz 之间 )。
        LSI RC可以通过控制 / 状态寄存器 (RCC_CSR) 里的 LSION 位来启动或关闭。
        在控制/ 状态寄存器 (RCC_CSR) 里的 LSIRDY 位指示低速内部振荡器是否稳定。在启动阶段,直到这个位被硬件设置为’1’ 后,此时钟才被释放。如果在时钟中断寄存器 (RCC_CIR) 里被允许,
将产生 LSI 中断申请。

2.6锁相环时钟PLL(Phase-Locked Loop Clock)

        内部PLL 可以用来倍频 HSI RC 的输出时钟或 HSE 晶体输出时钟。
        PLL的设置 ( 选择 HIS 振荡器除 2 HSE 振荡器为 PLL 的输入时钟,和选择倍频因子 ) 必须在其被激活前完成。一旦PLL 被激活,这些参数就不能被改动。
        如果PLL 中断在时钟中断寄存器里被允许,当 PLL 准备就绪时,可产生中断申请。
        如果需要在应用中使用USB 接口, PLL 必须被设置为输出 48 72MHZ 时钟,用于提供 48MHz 的USBCLK时钟,如下图所示。
        根据前面介绍的PLLSRC、PLLMUL、PLLXTPRE三个数据选择器,共同来对PLL锁相环时钟进行作用。

2.7CSS时钟安全系统(CSS)

        

        CSS之前提到是在RCC_CR时钟控制寄存器中使能的,这点需要注意。
        时钟安全系统可以通过软件被激活。一旦其被激活,时钟监测器将在HSE 振荡器启动延迟后被使能,并在HSE 时钟关闭后关闭。
        如果HSE 时钟发生故障, HSE 振荡器被自动关闭,时钟失效事件将被送到高级定时器 (TIM1
TIM8) 的刹车输入端,并产生时钟安全中断 CSSI ,允许软件完成营救操作。此 CSSI 中断连接到
Cortex™-M3 NMI 中断 ( 不可屏蔽中断 )
注意: 一旦 CSS 被激活,并且 HSE 时钟出现故障, CSS 中断就产生,并且 NMI 也自动产生。 NMI 将被不 断执行,直到 CSS 中断挂起位被清除。因此,在 NMI 的处理程序中必须通过设置时钟中断寄存器 (RCC_CIR) 里的 CSSC 位来清除 CSS 中断。
        如果HSE 振荡器被直接或间接地作为系统时钟, ( 间接的意思是:它被作为 PLL 输入时钟,并且PLL时钟被作为系统时钟 ) 时钟故障将导致系统时钟自动切换到 HSI 振荡器,同时外部 HSE 振荡
器被关闭。在时钟失效时,如果 HSE 振荡器时钟 ( 被分频或未被分频 ) 是用作系统时钟的 PLL 的输
入时钟, PLL 也将被关闭
        换句话说,就是当HSE作为系统时钟,直接或间接(通过PLL),当HSE出现故障时会将时钟源切换为HSI,同时HSE(和PLL)会被关闭。 

2.8系统时钟的输入来源

        图中的黑色、紫色、红色,分别对应HSI、PLL、HSE的时钟输出,最终输出到SYSCLK系统时钟,供外设使用。

3.时钟的分频

        上图为系统输入到外设的情况。
        一般情况下,HSE外部晶振8MHz经过PLL锁相环9倍频,得到72MHz作为系统时钟输出SystemClock,AHB的系数配置为1。
        先看到对APB1外设的输入设置:
        72MHz输入经过APB1预分频器2分频,也就得到最大36MHz的时钟输入到APB1的外设,同时需要使能APB1的外设时钟也就是RCC_APB1PeriphClockCmd,与门相当于开关,控制36MHz时钟的输入。
        接下来是对TIMx(x=2~7)的时钟输入,如果APB1预分频系数为1,则频率不变,否则×2。根据这句话,可以得到TIMx定时器的时钟输入为36MHz×2,也就是72MHz。
        可以看到即使是在APB1上的外设,也是有72MHz系统时钟来驱动的外设。

        类似的,72MHz系统时钟经过APB2预分频器1分频,作为时钟输入PCLK2,同时如果APB2预分频系数为1,则频率不变,否则×2。输入到TIM1和TIM8中的TIM定时器也为72MHz所以可以得出,TIMx所有定时器的输入时钟频率都为72MHz。

        同样的,这72MHz系统时钟还输入到DMA,ADC、SDIO等外设,这些就自行探索,这里就不在进行展开。

        在固件库中,ST公司已经帮我们配置好了时钟树的开启,在SystemInit函数中,感兴趣的可以去了解。

4.总结

        最后希望这篇文章能够帮助到有需要的人,也欢迎各位讨论及指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值