(一)既然外设只要系统时钟管理,为什么要分那么多时钟源?
- 多个时钟源可以在单个时钟源发生故障时,起到救急的作用
- 一个外设有多个时钟源,可以根据需要选择相应频率的时钟源
(二)为什么我们需要配置时钟?
实际上,当我们创建工程导入启动文件的时候,在main函数开始调用之前,启动文件就已经调用了SystemInit函数对系统时钟进行初始化了。(这里说下启动文件的5个作用,设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、调用C库函数_main最终去到C的世界)。
看stm32的固件库提供的库函数(stm32f10x为例),系统只提供了五种频率,所以需要我们配置。
(三)四个时钟的用处总结(频率是F1的)
- HSE 外部高速时钟:外部晶振提供信号,时钟频率一般在4-16MHz,是经常会用到的时钟源。
- HSI 内部高速时钟:内部RC震荡电路提供信号,时钟频率为8MHz,所以频率会随着温度产生漂移,很不稳定,所以一般不使用此时钟信号
- LSE 外部低速时钟:外部晶振提供信号,时钟频率一般为32.768KHz,一般用于RTC实时时钟
- LSI 内部低速时钟:内部RC振荡电路提供信号,时钟频率一般为40KHz,一般用于独立看门狗时钟
(四)关于SystemInit()函数
系统初始化时钟的流程:startup(汇编程序) -> SystemInit() -> SetSysClock() -> SetSysClockTo72() -> main().系统会默认设置为72MHZ
(五)时钟的配置步骤
- 配置HSE_VALUE,告诉HAL库外部晶振频率,stm32xxxx_hal_conf.h
- 调用SystemInit()函数,在启动文件中调用, 在system_stm32xxxx.c定义
第1,2步可以理解为开启HSE,等待开启并保证没有异常,第二步设定了默认的频率 - 配置时钟源,配置PLL,HAL_RCC_OscConfig()函数
- 选择系统时钟源,配置总线分频器,HAL_RCC_ClockConfig()函数
第3,4步可以理解为配置好PLL、APB1、APB2、ABH的分频因子 - (H7类特有)配置扩展外设时钟,HAL_RCCEx_PeriphCLKConfig()函数
第5步是为了保证外设得到了时钟
第3,4,5步合在一起就是sys_stm32_clock_init()操作
(六)两个函数的内部的配置选择(可以根据手册看各种设置)
F1:
F4/F7:
H7:
(七)关于CUBEMX配置时钟
三个选项的介绍:
- BYPASSS Clock Source:外部时钟源(HSE旁路)模式
无需使用外部晶体模式下所需的芯片内部时钟驱动组件,直接从外界导入时钟信号。犹如芯片内部的驱动组件被旁路了。 - Crystal/Ceramic Resonator:外部晶体/陶瓷谐振器(HSE晶体)模式
该时钟源是由外部无源晶体与MCU内部时钟驱动电路共同配合形成,有一定的启动时间,精度较高。 - Disable:禁用