浅谈时钟启动和Systemlnit函数
时钟是STM32的关键,是整个系统的心脏,时钟如何启动,时钟源如何选择,各个参数如何设置,我们从源码来简单分析一下时钟的启动函数Systemlnit()。
Systemlnit函数简介
我们先来看一下源程序的注释
/** @addtogroup STM32F1xx_System_Private_Functions
* @{
*/
/**
* @brief Setup the microcontroller system
* Initialize the Embedded Flash Interface, the PLL and update the
* SystemCoreClock variable.
* 初始化微控制器系统
* 初始化嵌入式闪存接口、锁相环并更新系统核心时钟变量
* @note This function should be used only after reset.
* 本函数仅在复位后使用
* @param None
* @retval None
*/
函数作用
SystemInit()
是STM32 HAL库的核心初始化函数,负责完成以下关键任务:
- 系统时钟配置:初始化时钟树(如HSE、HSI、PLL),设置
SystemCoreClock
变量。 - 中断向量表重置:将中断向量表映射到Flash的起始地址(0x08000000)。
- 低功耗模式配置:默认禁用低功耗模式(如Sleep/Stop模式)。
- 微控制器型号识别:读取
SCB->IDPROM
识别芯片型号。 - 全局变量初始化:如
__main
符号的设置(跳转至主程序入口)。
函数调用时机
- 自动调用:在汇编启动项内有相关的启动指令,重新上电,按下重置按钮,都进行该汇编程序。
- 手动调用:需在代码中显式调用(如系统复位后重新配置时钟):
int main(void) {
SystemInit(); // 显式调用
// 后续初始化(GPIO、外设等)
}
读源码分析默认时钟来源
第一步
我们查芯片手册看CR寄存器,上述操作对CR寄存器进行了0x00000001或等于操作,将内存第0位变为1。
对应的HSION解释如下
RCC->CR |= 0x00000001U;
开启了内部8MHz时钟HSI RC
第二步
对CFGR寄存器进行与等于操作
对CFGR内存中的26—24位、15—14位、13—11位、10—8位、7—4位、3—2位、1—0位进行了变0,我们对应手册看进行了什么操作
MOC关闭时钟,PCLK2 2分频后给ADC使用,APB1和APB2的PCLK不分频、AHB不分频、设置HSI为系统时钟源,SW系统时钟切换选择HSI。
第三步
与等于操作CR寄存器
PLL关闭,时钟检测器关闭,HSE外部振荡器关闭。
第四步
与等于操作CR寄存器
关闭HSEBYP,前提时关闭了HSE震荡器,所以源码对CR寄存器分两步操作,先关闭外部振荡器,再关闭HSEBYP。
第五步
第六部
直接赋值CIR寄存器
用可写的各个中断标志来清除各中断标志
第七部
用来设置向量表,表示向量不进行偏移