深度解析STM32 时钟
扫描二维码
随时随地手机看文章
系统时钟是STM32微控制器中最重要的部分之一,它负责提供时序信号以驱动处理器核心、外设和其他系统模块的运行。
系统时钟通常由多个时钟源、时钟分频器和时钟树组成,这些组件共同构成了系统时钟的组成和层级结构。
01 前言
在嵌入式系统中时钟是其脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作。外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。
02 STM32时钟源
◆ HSI是高速内部时钟,RC振荡器,频率为8MHz。
◆ HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,比较常用的8MHz 12MHz 25MHz。
◆ LSI是低速内部时钟,RC振荡器,频率为40kHz。
◆ LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
在STM32中每个外设都有其单独的时钟,在使用某个外设之前必须打开该外设的时钟 ,为什么要这么麻烦来设置每一个外设的时钟而不是将所有外设的时钟统一打开?因为STM32的外设繁多,外设的运作所需要的最佳时钟各不相同,如果所有时钟同时运行会给MCU带来极大的负载,所以STM32为了实现低功耗,而设计的功能完善构成复杂的时钟系统,称之时钟树。使外设功能的时钟可自配置。
03 STM32 时钟树
如果需要精度较高的RTC时钟,需要使用LSE,频率为32.768K提供一个精确的时钟源。
HSI为8M,和HSE相比精度较差,对于性能无要求场景又要节省成本使用HSI。
在时钟树系统中,主时钟选择由PLL生成,PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
css时钟监视系统但HSE失效时自动切换至HSI5、外设有独立的时钟分频配置,主要有USB、SDIO、FSMC、APB1、APB2、ADC等。APB1和APB2是俩个总线桥:APB1和APB2,其中APB1是低速总线,APB2是全速总线。
以STM32F105为例打开工程选择HSE,选择外部晶振作为输入。
二、STM32时钟源
时钟源用来产生系统时钟信号,STM32有以下内部时钟源和外部时钟源:
1. HSE
HSE(High-Speed External)是指高速外部时钟,使用外部晶振,常见频率有 8MHz、12MHz、16MHz等。
在STM32微控制器中,HSE通常被配置为系统的主时钟源,用于产生系统的主时钟信号。通过将HSE连接到微控制器的时钟输入引脚(通常是HSE引脚),可以将外部晶体振荡器的时钟信号输入到微控制器中。
2. HSI
HSI(High-Speed Internal)是指高速内部时钟,它由微控制器内部的8MHz RC振荡器提供,用于产生系统的主时钟信号。
HSI可直接作为系统时钟或2分频后作为PLL输入。
3. LSE
LSE(Low-Speed External)是指低速外部时钟,频率32.768kHz。它为实时时钟或其它定时功能提供一个低功耗且精确的时钟源。
4. LSI
LSI(Low-Speed Internal)低速内部时钟,频率大约是 40kHz(30kHz~60kHz之间),它可以在停机或待机模式下运行,可供看门狗使用或自动唤醒使用。
3. 时钟分频器
时钟分频器是用于将系统时钟频率分频为所需频率的模块。在STM32微控制器中,时钟分频器可以用于调整各个外设的时钟频率,以满足不同外设的工作要求。
时钟分频器有以下几种类型:
(1)AHB分频器
用于将系统主时钟(AHB 总线时钟)分频为用于驱动存储器和某些外设的时钟信号。
AHB是高性能系统总线,主AHB总线用于DMA、中断控制器等;子AHB总线连接到主AHB总线上,并连接到次要外设,如GPIO、SPI、I2C等。
(2)APB分频器
用于将 AHB 总线时钟分频为用于驱动低速外设的时钟信号。在STM32中,有两个APB总线,即APB1和APB2,它们分别驱动不同类型的外设。APB 分频器可以将 AHB 总线时钟分频为适合驱动这些外设的频率。
(3)锁相环PLL(Phase-Locked Loop)分频器
用于调整 PLL 时钟源的频率,以产生所需的系统时钟频率。通过调整 PLL 分频器的分频系数,可以实现将外部高频振荡器(HSE)的频率倍增到系统所需的主时钟频率。
三、时钟树
1. 时钟树
时钟树是指微控制器中各种时钟信号之间的关系和组织结构。
2. 主时钟输出MCO(Main Clock Output)
MCO 是 STM32微控制器中的主时钟输出功能。通过MCO功能,可以将系统的主时钟信号输出到特定的引脚,以供外部设备使用。
STM32微控制器通常提供一个或多个MCO引脚,用于输出主时钟信号。MCO引脚通常可配置为多种功能,如系统时钟(SYSCLK)、高速外部时钟(HSE)、PLL时钟等。
3. USB预分频器
USB预分频器的主要作用是根据输入时钟信号的频率,将其分频以生成USB所需的时钟信号。USB通信中的时钟信号要求精确,因此需要通过预分频器来保证时钟信号的稳定和准确性。
如果要在应用中使用USB接口,PLL必须被设置为输出48或72MHz时钟,用于提供48MHz的USBCLK时钟。
4. SYSCLK
SYSCLK是整个系统的主时钟信号,用于驱动CPU核心和大多数外设的时钟信号。
SYSCLK的源头通常来自于STM32微控制器中的晶体振荡器(HSE)或内部RC振荡器(HSI)。
SYSCLK 最大9倍频 * 8MHz 可以由PLLCLK提供72MHz频率。
5. PLLCLK
PLLCLK是指锁相环(PLL)产生的时钟信号,PLLCLK的频率是通过HSE或HSI的频率进行倍频得到的。
PLLCLK 可以通过相应的寄存器配置来设置PLL的工作参数,如倍频系数(PLLMUL)、分频系数(PLLDIV),以及时钟源的选择(HSE或HSI)。通过合适的配置,可以得到所需的PLLCLK频率。
6. RTC时钟
RTC时钟用于提供准确的实时时钟和日历功能,通常与外部32.768kHz晶体振荡器配合使用。
四、RCC寄存器
RCC(Reset and Clock Control)主要负责系统时钟的控制和管理,它提供了一系列的寄存器,用于配置和控制处理器的时钟源、时钟频率和时钟分频器,以及外设的时钟使能和配置。
系统时钟设置步骤
1. 步骤说明
选择时钟源:
首先需要确定系统时钟源,通常可以是内部时钟源(HSI 或 HSE)或外部时钟源(例如外部晶体振荡器)。
配置时钟源:
根据需要,使能并配置所选的时钟源。对于外部时钟源,需要配置外部晶体振荡器(HSE)或外部时钟输入(例如 HSE 或者 PLL)。对于内部时钟源,例如 HSI,可以直接使能。
配置 PLL(可选):
如果需要更高的系统时钟频率,则可以配置 PLL 来实现时钟倍频。在这一步中,需要设置 PLL 的输入时钟源、倍频系数以及输出时钟频率。
配置时钟分频器:
配置 AHB、APB1 和 APB2 的分频系数,以确定这些总线的时钟频率。这些分频系数可以根据系统需求进行调整,以满足外设的时钟要求。
等待时钟稳定:
对于外部时钟源(如 HSE),需要等待其稳定后再切换到该时钟源。
切换系统时钟:
最后,将系统时钟切换到所选的时钟源。确保切换后,系统时钟以正确的频率运行,并且各个外设和总线的时钟也被正确配置。
配置 Flash 读取延迟:
根据新的系统时钟频率,配置 Flash 存储器的读取延迟以确保稳定的 Flash 访问速度。这一步对于高频率下的系统运行至关重要。
五、SystemInit()初始化时钟分析
系统复位后,HSI被选为系统时钟。
在STM32的启动代码中,通常会包含一个名为SystemInit()的函数,该函数用于初始化系统的时钟和其他重要的系统配置。