当前位置: 首页 > news >正文

浅谈时钟启动和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寄存器

用可写的各个中断标志来清除各中断标志

第七部

用来设置向量表,表示向量不进行偏移

最终操作结果

相关文章:

  • 管理学习状态
  • 精准车型识别:视觉分析技术的力量
  • 强化学习(赵世钰版)-学习笔记(7.时序差分学习)
  • 在 Windows 上快速部署 OpenManus:从安装到运行
  • (七)使用X99主板搭配双XEON E5-2660 V4或同系列CPU+NVIDIA P106-100部署Deepseek的可行性
  • 简单5位验证码+快捷键的使用
  • 配置普通链接二维码规则 校验文件检查失败
  • 将后缀为GGUF 模型,运行在Ollama
  • 如何自己做奶茶,从此告别奶茶店
  • 基于Spring Boot的小区疫情购物系统的设计与实现(LW+源码+讲解)
  • 【从零开始学习计算机科学】数据库系统(三)关系数据库设计
  • 2024年第十五届蓝桥杯软件C/C++大学A组——五子棋对弈
  • Pandas真实案例进阶:从数据清洗到高性能分析的完整指南
  • 数据结构与算法——哈希表,数组加强哈希表,双链表加强哈希表
  • 【算法day9】回文数-给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
  • Python和FastAPI框架开发和容器化部署AWS上支持多种LLM和向量数据库的微服务API
  • Mysql的utf8mb4_general_ci 与 utf8mb4_bin 的具体区别是什么?中文适合哪个?
  • 如何使用 ONLYOFFICE 宏对 PDF 表单中的特定字段执行计算
  • Gemini Robotics:Google DeepMind 让 AI 机器人真正“动”起来!
  • DeepSeek模型本地化部署方案及Python实现
  • 第三款在美获批的国产PD-1肿瘤药来了,影响多大?
  • 今年地质灾害防治形势严峻,哪些风险区被自然资源部点名?
  • 贵州赤水被指“整改复耕”存形式主义,当地部署耕地流出整改“回头看”
  • 《我的后半生》:人生下半场,也有活力重启的可能
  • 中国驻英国大使郑泽光:中国反制美国关税是为了维护国际公平正义和多边贸易体制
  • 体坛联播|卡马文加预计伤缺三个月,阿尔卡拉斯因伤退赛