浅谈时钟启动和Systemlnit函数

news2025/3/14 8:23:29

时钟是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寄存器

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

第七部

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

最终操作结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySql学习_基础Sql语句

目录 1.数据库相关概念 2.SQL 2.1 SQL通用语法 2.2 SQL分类 2.3 DDL(数据库定义语言) 2.4 DML(数据操作语言) 2.5 DQL(数据查询语言) 2.6 DCL(数据控制语言) 3. 函数 3.1 字…

小白学Agent技术[5](Agent框架)

文章目录 Agent框架Single Agent框架BabyAGIAutoGPTHuggingGPTHuggingGPT工作原理说明GPT-EngineerAppAgentOS-Copilot Multi-Agent框架斯坦福虚拟小镇TaskWeaverMetaGPT微软UFOAgentScope现状 常见Agent项目比较概述技术规格和能力实际应用案例开发体验比较ChatChain模式 Agen…

VSTO(C#)Excel开发4:打印设置

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

设计模式Python版 模板方法模式(上)

文章目录 前言一、模板方法模式二、模板方法模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间…

transformer bert 多头自注意力

输入的(a1,a2,a3,a4)是最终嵌入,是一个(512,768)的矩阵;而a1是一个token,尺寸是768 a1通过wq权重矩阵,经过全连接变换得到查询向量q1;a2通过Wk权重矩阵得到键向量k2;q和k点乘就是值…

python-leetcode-定长子串中元音的最大数目

1456. 定长子串中元音的最大数目 - 力扣(LeetCode) 可以使用 滑动窗口 方法来解决这个问题。步骤如下: 初始化:计算前 k 个字符中元音字母的个数,作为初始窗口的值。滑动窗口:遍历字符串,每次右…

MySQL增删改查操作 -- CRUD

个人主页:顾漂亮 目录 1.CRUD简介 2.Create新增 使用示例: 注意点: 3.Retrieve检索 使用示例: 注意点: 4.where条件查询 前置知识:-- 运算符 比较运算符 使用示例: 注意点&#xf…

【算法day9】回文数-给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文&#…

蛋白质功能预测论文阅读记录2025(DPFunc、ProtCLIP)

前言 最近研究到瓶颈了,怎么优化都提升不了,遂开始看点最新的论文。 DPFunc 2025.1.2 Nature Communication 中南大学 论文地址:DPFunc: accurately predicting protein function via deep learning with domain-guided structure inform…

主流向量数据库对比

在 AI 的 RAG(检索增强生成)研发领域,向量数据库是存储和查询向量嵌入的核心工具,用于支持高效的语义搜索和信息检索。向量嵌入是文本或其他非结构化数据的数值表示,RAG 系统通过这些嵌入从知识库中检索相关信息&#…

54.HarmonyOS NEXT 登录模块开发教程(八):测试与调试技巧

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT 登录模块开发教程(八):测试与调试技巧 文章目录 HarmonyOS NEXT 登录模块开发教程(…

在Simulink中将Excel数据导入可变负载模块的方法介绍

文章目录 数据准备与格式要求Excel数据格式MATLAB预处理数据导入方法使用From Spreadsheet模块(直接导入Excel)通过MATLAB工作区中转(From Workspace模块)使用1-D Lookup Table模块(非线性负载映射)Signal Builder模块(变载工况导入)可变负载模块配置注意事项与调试在S…

动手学强化学习-记录

3.5 蒙特卡洛方法 统计每一个状态s出现的总次数和总回报,用大数定律,总回报/总次数≈状态s的期望回报 第4章 动态规划算法 策略迭代中的策略评估使用贝尔曼期望方程来得到一个策略的状态价值函数,这是一个动 态规划的过程;而价值迭代直接使用贝尔曼最…

阿里云操作系统控制台评测:国产AI+运维 一站式运维管理平台

阿里云操作系统控制台评测:国产AI运维 一站式运维管理平台 引言 随着云计算技术的飞速发展,企业在云端的运维管理面临更高的要求。阿里云操作系统控制台作为一款集运维管理、智能助手和系统诊断等多功能于一体的工具,正逐步成为企业高效管理…

C++中的const与类型转换艺术

目录 强制转换 static_cast const_cast reinterpret_cast dynamic_cast const关键字 修饰内置类型* 修饰指针类型* 类比 数组指针 指针数组 函数指针 指针函数 强制转换 C语言中的强制转换在C代码中依然可以使用,这种C风格的转换格式非常简单 TYPE a …

特辣的海藻!10

基础知识点 1.清除换行符 scan.nextInt()要加scan.nextLine()清楚换行符。 2.Map.Entry<K, V> Map.Entry是Map接口的嵌套接口&#xff0c;表示一个键值对&#xff08;Key-Value&#xff09; 常用方法&#xff1a; entry.getKey()&#xff1a;获取键 …

sqli-lab靶场学习(八)——Less26-28

前言 25关已经出现了初步的一些关键字过滤&#xff0c;通过双写可以绕过。后面的关卡&#xff0c;我们会遇到更多关键字过滤&#xff0c;需要各种技巧绕过。 Less26 第26关写了会过滤空格和注释符。有很多的答案&#xff0c;会用%a0替代空格&#xff0c;但据说这是sqli-labs部…

双指针算法专题之——复写零

文章目录 题目介绍思路分析异地复写优化为就地复写 AC代码 题目介绍 链接: 1089. 复写零 思路分析 那么这道题我们依然可以使用双指针算法来解决 异地复写 先不考虑题目的要求&#xff0c;直接就地在原数组上修改&#xff0c;可能不太好想&#xff0c;我们这里可以先在一个…

python-leetcode-子数组最大平均数 I

643. 子数组最大平均数 I - 力扣&#xff08;LeetCode&#xff09; 可以使用滑动窗口&#xff08;Sliding Window&#xff09;的方法来解决这个问题。具体步骤如下&#xff1a; 先计算数组 nums 中前 k 个元素的和 sum_k&#xff0c;作为初始窗口的和。然后滑动窗口&#xff0…

【度的数量——数位DP】

题目 分析 数位DP可以解决“区间内满足某种性质的数的个数”的问题 通常按照数位分支&#xff0c;形成一颗数位树 最左分支的值由上界值决定&#xff0c;右分支可以直接计算权重 有可能最左分支会有一个权重 代码 #include <bits/stdc.h> using namespace std;cons…