- STM32的时钟系统由多个时钟源和时钟树组成
- 时钟源包括主时钟源(HSE)、内部高速时钟源(HSI)、内部低速时钟源(LSI)和外部低速时钟源(LSE)。
- 时钟树由多个时钟分频器和时钟门控器组成,可以将输入时钟源分频得到多个时钟信号,并且根据需要打开或关闭时钟门控器来控制时钟信号的输出。
下面这个是我从AI中查询的,我觉得还是很有参考意义的
STM32的主时钟源为HSE,可以通过外部晶振或者外部时钟信号输入。内部高速时钟源HSI为8MHz,可以通过RCC_CR寄存器控制开关。内部低速时钟源LSI为40kHz,主要用于RTC模块。外部低速时钟源LSE为32.768kHz,同样用于RTC模块。
时钟树主要由以下几个部分组成:
1.系统时钟分频器(SYSCLK):用于分频主时钟源或者内部高速时钟源,得到系统时钟(SYSCLK)。
2.AHB总线时钟分频器(HCLK):用于分频系统时钟,得到AHB总线时钟(HCLK)。
3.APB1总线时钟分频器(PCLK1):用于分频AHB总线时钟,得到APB1总线时钟(PCLK1)。
4.APB2总线时钟分频器(PCLK2):用于分频AHB总线时钟,得到APB2总线时钟(PCLK2)。
5.时钟门控器:用于控制各个外设的时钟开关,从而节省功耗。
下面对Stm32的时钟系统做一个系统性的复习和总结
时钟系统,理解时钟,看那个CubeMX时钟配置较为方便,虽然还是比较喜欢使用标准库哈哈
在Stm32中,有五个时钟源,分别为
HSI、HSE、LSI、LSE、PLL
从时钟频率来看可以分为高速时钟源和内部时钟源
HSI、HSE、PLL是高速时钟,LSI和LSE是低速时钟
从来源来看分为外部时钟源和内部时钟源
HSE和LSE是外部时钟源,其他的是内部时钟源
HSI是
高速内部时钟,RC振荡器,频率为8MHZ
由内部的8MHZ的RC震荡器所产生
可以直接作为
系统时钟
,或者二分频作为PLL输入
看下图就清楚了
HSE是高速外部时钟
,他的时钟信号由以下两种时钟源产生
这个频率的范围为4MHZ-16MHZ
一般接8MHZ的晶振
PLL是锁相环倍频输出,PLL的输入可选
倍频可以选择2-16倍频,但是最大的输出频率不能超过72MHZ
时钟的选择和选择倍频因子必须在其被激活前完成
如果要使用USB口,PLL必须被设置为48或72MHZ的时钟,用于提供48MHZ的USBCLK时钟
LSE是低速外部时钟,接外部晶振,频率为32.768KHZ
它为实时时钟RTC
,或者其他定时功能
提供一个低功耗且精确的时钟源
LSI是低速内部时钟,RC震荡器,频率为40KHZ
,独立看门狗的时钟源只能是LSI,同时LSI是一个低耗的时钟源
它可以在停机和待机模式下保持运行,为独立看门狗
和自动唤醒单元提供时钟
系统时钟SYSCLK的时钟来源可以是以下几种
系统中所有外设的时钟来源都是来源于SYSCLK,SYSCLK通过AHB时钟分频后,送给各模块使用
其中
RTC实时时钟,有以下三个来源
一般来说,MCU的时钟基本上来源于外部晶振8MHZ,经过PLL锁相环倍频后,传递给系统时钟
但是如果晶振电路出现了错误,产生不了精确的时钟,那么CSS将会起作用
他会把系统时钟自动切换成
HSI
内部高速晶振,频率为8MHZ
MCU允许输出时钟信号到外部MCO引脚,这个引脚是PA8
这个MCO时钟输出引脚可以输出
启动文件的作用,在Stm32f10x_hd.s中,文件注释中已经详细介绍,经过翻译如下
总的来说就是
Stm32根据不同的使用场景和FLASH的大小,分为了不同的产品,不同的产品的缩写不同
SysTick主要用来延时,或者是实时系统的心跳时钟,这样可以节省MCU的资源,不用浪费一个定时器
SysTick是一个24位的到倒计数定时器
,当计数到0时,将从RELOAD寄存器中自动重装载定时初值,开始新一轮计数。只要不把SysTick控制及状态寄存器中的使能位清除,就永不停息
即使在睡眠状态下也能工作运行
使用SysTick来实现延时,极大的节省了系统资源
SysTick的中断优先级也可以设置
在
Stm32F10xxx
参考手册中 ,系统滴答校准值为9000,当系统滴答时钟设定为9MHZ,为HCLK/8的最大值时,产生1ms的基准
CM3为SysTick提供两个时钟源
SysTick滴答定时器,在
FreeRTOS
中,就是使用SysTick滴答定时器来推动任务的切换和时间的管理
固件库中SysTick的配置在misc.c
和core_cm3.h
文件中
misc.c
文件中core_cm3.h
文件中SysTick的初始化
开启SysTick中断,并且使能SysTick中断,以及SysTick中断的时间间隔
简单的说ticks的值就是relaod的值,中断会在val==0的时候产生,两次中断就是val的值从reload到0的时间
选择外部时钟HCLK,八分频,此时时钟为9MHZ
我们在上面已经说过,
当系统滴答时钟设定为9MHZ,为HCLK/8的最大值时,产生1ms的基准
初始化完成后,即可实现延时
将延时加载到LOAD寄存器中,并且清空计数器,等待时间到达,关闭计数器,清空计数器
间间隔
简单的说ticks的值就是relaod的值,中断会在val==0的时候产生,两次中断就是val的值从reload到0的时间
从初始值开始,向下计数,计数到0,产生中断,如此反复
选择外部时钟HCLK,八分频,此时时钟为9MHZ
初始化完成后,即可实现延时
将延时加载到LOAD寄存器中,并且清空计数器,等待时间到达,关闭计数器,清空计数器