STM32系统时钟RCC(基于HAL库)
基础认识
为什么要有时钟:
时钟就是单片机的心脏,其每跳动一次,整个单片机的电路就会同步动作一次。时钟的速率决定了两次动作的间隔时间。速率越快,单片机在单位时间内所执行的动作将越多。时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率。
为什么这么多个时钟源:
STM32系统是复杂的,高精度、低精度、高速、低速等,且可以对每个时钟源进行开关操作,可以把不需要使用的关闭掉。这可以让单片机适用更多的环境中,把选择权利交个了开发者,开发者可以从精度、功耗、资源等多方面考虑。
STM32时钟:
从时钟源的角度可分为:
l 外部时钟(E)
l 内部时钟(I)
从时钟速率的角度分为:
l 高速时钟(HS)
l 低速时钟(LS)
STM32在芯片复位后默认选用的是内部的高速时钟(HSI)进行工作,如果需要使用外部高速时钟(HSE)的话需要经过软件操作相关的寄存器配置。
外部时钟模式
外部的高速和低速时钟均有这三个可选项目,图中是CubeMX提供的外部时钟选择:
可选类型为
l Disable(关闭,不使用外部时钟)
l BYPASS Clock Source(旁路时钟源)
l Crystal/Ceramic Resonator(外部晶体/陶瓷谐振器)
外部晶体/陶瓷谐振器模式
该模式较为常见,这可以为系统时钟提供较为精确的时钟源。该时钟源是由外部无源晶体与MCU内部时钟驱动电路共同配合形成,有一定的启动时间,精度较高。为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容必须尽可能地靠近振荡器引脚。负载电容值必须根据所选择的晶体来具体调整。
整体上讲,陶瓷晶体和石英晶体的主要区别就在于精度和温度稳定性上。石英晶体比陶瓷晶体精度要高,温度稳定性要好。
旁路时钟源模式
该模式下必须提供外部时钟。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SOC_IN引脚,此时OSC_OUT引脚对外呈高阻态。
所谓旁路模式,是指无需上面提到的使用外部晶体时所需的芯片内部时钟驱动组件,直接从外界导入时钟信号。
旁路时钟源的典型应用--有源晶振
有源晶振一般是四脚封装,电源、地线、振荡输出和一个控制端【或者悬空端】。相比无源晶体,有源晶振本身就是个完整的振荡器件,只需要供给适当的电源就能输出时钟,无须额外的振荡驱动匹配电路。其时钟输出不依赖于外部器件振荡电路,相对更不容易受外部线路不稳定性的影响。自然其价格往往要高于无源晶体,不过其输出电平幅度往往不能像无源晶体那样随着应用电路的变化而变化。
STM32系统时钟框图
系统时钟源总共有4个:
l HSI RC:内部高速RC振荡器,相比于外部精度较低。通常约为8MHZ。通常作为系统的备用时钟源(CSS控制)
l LSI RC:内部低速RC振荡器,相比于外部精度较低。通常约为40KHZ。通常作为看门狗时钟源。
l HSE:外部高速时钟,精度高,可接外部晶体/陶瓷谐振器或旁路时钟源。范围为4MHZ-16MHZ。通常通过PLL倍频作为系统时钟源。
l LSE:外部低速时钟,精度高,可接外部晶体/陶瓷谐振器或旁路时钟源。通常为32.768KHZ。通常作为RTC时钟源。
其它:
l 其中SYSCLK是系统时钟,对于每个芯片都有规定最大的系统时钟是多少,超过则会出现错误。芯片的很多外设都是基于该时钟的。
l CSS为时钟监视系统,一旦HSE失效则自动切换至系统时钟(SYSCLK)为内部高速RC振荡器时钟(HSI)。
l MCO是时钟输出引脚,对应单片机的一个GPIO口,可以选择输出SYSCLK、HSI、HSE、PLLCLK/2的其中一个。
l 时钟可以进行独立的开启和关闭
在STM32F103C8T6芯片中:
PC14和PC15是外部低速时钟的输入脚
PD0和PD1是外部高速时钟的输入脚
PA8是时钟输出引脚,输出的时钟可编程选择
通常外部高速和低速时钟输入脚在不使用的情况下也尽量不要作为普通独立IO使用
STM32F103C8T6的时钟配置图:
l LSE外部低速时钟的频率为32.768KHZ,给系统的RTC做为时钟源
l LSI内部低速时钟的频率为40KHZ,给系统的独立看门狗作为时钟源
l HIS内部高速时钟暂时没有用到,频率为8MHZ,但是值得注意的是“CSS Enabled”与“Enable CSS”的区别,前者表示开启了。
l “CSS Enabled”表示开启了时钟监视系统,一旦HSE失效则自动切换至系统时钟(SYSCLK)为内部高速RC振荡器时钟(HSI)
l HSE选择的是8MHZ,可以选择的范围为4-16MHZ
l 系统时钟(SYSCLK)为72MHZ。时钟来源是HSE经过PLL倍频
l MCO时钟输出选择的是PLLCLK/2,按照时钟选择可以理解为是SYSCLK/2,即72MHZ/2=36MHZ