STM32 学习笔记-----STM32 的启动过程

news2024/11/17 5:05:12

STM32 的启动过程是一个精细而系统的流程,它涉及从芯片复位开始,到初始化系统、设置时钟、运行主程序等一系列步骤。下面详细介绍 STM32 启动过程的主要步骤。

1. Boot引脚设定

STM32 系列芯片有多个启动模式,这些模式是通过引脚(如 BOOT0 引脚)来设置的。具体的启动模式取决于 BOOT0 和 BOOT1 的状态。

  • BOOT0 = 0:默认启动模式,通过内部闪存启动,执行闪存中的固件。
  • BOOT0 = 1:从系统存储器启动,通常是指跳转到内置的引导加载程序(Bootloader)。
  • BOOT1 = 0/1:取决于 STM32 的不同型号,BOOT1 配置决定了是否可以通过某些特定的硬件引导程序启动,如通过 USB 或其他接口。

通过引脚配置,MCU 会选择合适的启动模式,这一步骤主要在硬件层面进行,设置后程序开始执行。

2. 查找初始地址并初始化栈指针(SP)

当 STM32 启动时,程序会从一个固定的地址开始执行。这个地址通常是由芯片的向量表(Vector Table)决定的,向量表中存放的是各种中断、异常的入口地址,包括复位向量。

  • 初始栈指针(SP) 是通过向量表的第一个位置获取的。向量表的第一个位置是 32 位的栈指针地址,MCU 会将该地址加载到栈指针寄存器(SP)中。
  • 然后,从向量表的第二个位置加载复位程序的入口地址(Reset_Handler),并将程序执行流跳转到该地址。

3. 复位程序(Reset_Handler)

在 STM32 启动后,CPU 会首先执行 Reset_Handler 函数。此函数的主要作用是完成一系列系统初始化操作,如:

  • 清空 .bss 段(未初始化的全局变量区)。
  • 设置 C 运行时环境,为后续的 C 语言代码执行做准备。
  • 初始化各类硬件外设,如看门狗、时钟等。

Reset_Handler 通常会调用 SystemInit 函数来完成一些基础的硬件配置,诸如系统时钟、外部时钟源初始化等。

4. 异常中断设置

在复位程序中,除了复位处理外,Reset_Handler 还会为中断控制器设置各类中断的初始状态,并使能相应的中断服务函数。

  • STM32 在启动时,会根据芯片的配置加载各类异常向量,包括硬件中断、系统异常等。
  • HardFault_Handler 是一个专门处理硬件故障的中断处理函数,它会在程序执行时出现不可恢复的错误(如除零错误或访问无效内存)时触发。

5. 系统时钟初始化(SystemInit)

Reset_Handler 执行过程中,通常会调用 SystemInit() 函数来进行系统时钟的初始化。该函数的工作内容通常包括:

  • 设置外部晶振或内部振荡器(HSI、HSE)的使能。
  • 配置 PLL(相位锁环)以提升系统时钟频率。
  • 设置系统时钟源,例如选择使用 PLL 输出作为主时钟。

这些步骤确保 MCU 的时钟系统在程序执行前正确配置,从而为后续的代码执行提供稳定的时钟信号。

6. 调用 C 库初始化函数

Reset_HandlerSystemInit 之后,通常会调用 C 语言运行时初始化函数,如 _init(),以便为 C 语言程序做好准备。这些初始化过程可能包括:

  • 初始化 stdio,为输入输出提供支持。
  • 设置一些 C 语言相关的运行时参数。

7. 主函数(_main)

最后,Reset_Handler 会跳转到 C 语言的主函数 _main,这是程序的入口点。此时,硬件和系统时钟已经准备就绪,C 库已初始化,栈指针也已经指向正确的位置,程序就可以开始执行了。

主函数 _main 通常是应用程序的入口,程序的实际逻辑、任务调度等都从这里开始。


总结

STM32 启动过程中的每一步都有其独特的作用,从硬件引脚设置、栈指针初始化,到异常中断设置、时钟初始化、C 库函数调用,最终跳转到 main 函数。这个过程确保了 MCU 在开始执行应用程序之前,所有硬件和系统资源都被正确初始化,保证了稳定的运行环境。

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

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

相关文章

仓库管理系统设计与实现(Java+Mysql)

目 录 摘 要 目 录 第1章 绪论 1.1 研究背景 1.2目的和意义 1.3 论文研究内容 第2章 程序开发技术 2.1 MySQL数据库 2.2 Java语言 第3章 系统分析 3.1可行性分析 3.1.1技术可行性分析 3.1.2经济可行性分析 3.1.3操作可行性分析 3.2系统运行环境 3.3系统流程分…

CentOS 8 安装 chronyd 服务

操作场景 目前原生 CentOS 8 不支持安装 ntp 服务,因此会发生时间不准的问题,需使用 chronyd 来调整时间服务。CentOS 8以及 TencentOS 3.1及以上版本的实例都使用 chronyd 服务实现时钟同步。本文介绍了如何在 CentOS 8 操作系统的腾讯云服务器上安装并…

datawhale11月组队学习 模型压缩技术3:2:4结构稀疏化BERT模型

文章目录 一、 半结构化稀疏性简介二、 代码实践2.1 定义辅助函数2.2 加载模型、tokenizer和数据集2.3 测试baseline模型指标2.4 对BERT-base模型进行半结构稀疏化 《datawhale2411组队学习之模型压缩技术1:模型剪枝(上)》:介绍模…

大数据学习15之Scala集合与泛型

1. 概述 大部分编程语言都提供了数据结构对应的编程库,并称之为集合库(Collection Library),Scala 也不例外,且它还拥有以下优点: 易用:灵活组合运用集合库提供的方法,可以解决大部分集合问题 简洁&#xf…

force stop和pm clear的区别

前言:因为工作中遇到force stop和pm clear进程后,进程不能再次挂起,谷歌系统共性问题,服务类应用经清缓存后当下服务就会挂掉,需要系统重启才能恢复。为了更好的“丢锅”,需要进一步学习force stop和pm cle…

SAP+Internet主题HTML样式选择

SAP目前只支持三种HTML样式选择: 样式一 背景色:深色,蓝 特点:适中型排列,与SAP界面排列相同,富含UI特征,整齐美观 URL地址:http://cn1000-sap-01.sc.com:8000/sap/bc/gui/sap/it…

VBA学习笔记:点击单元格显示指定的列

应用场景: 表格中列数较多,特定条件下隐藏一些无关的列,只保留相关的列,使表格更加清晰。 示例:原表格如下 点击一年级,只显示一年级相关的科目: 点击二年级,只显示二年级相关的科…

java版嘎嘎快充汽车单车充电系统源码系统jeecgboot

汽车使用云快充1.6 1.5协议,单车用的铁塔协议 前端uniapp、后端jeecgbootvue2

这些场景不适合用Selenium自动化!看看你踩过哪些坑?

Selenium是自动化测试中的一大主力工具,其强大的网页UI自动化能力,让测试人员可以轻松模拟用户操作并验证系统行为。然而,Selenium并非万能,尤其是在某些特定场景下,可能并不适合用来自动化测试。本文将介绍Selenium不…

qt QFrame详解

1、概述 QFrame是Qt框架中用于提供框架或边框的控件,主要用于在图形用户界面(GUI)中创建框架,并提供各种边框样式和功能。它是Qt中一个基础的容器类,也是许多基础控件的基类,可以被QLCDNumber、QToolBox、…

python json详解

json 是 Python 中用于处理 JSON 数据的标准库。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。Python 的 json 模块提供了将 Python 对象与 JSON 数据相互转换的功…

ISUP协议视频平台EasyCVR私有化部署视频平台如何实现RTMP推流将大疆无人机的视频画面回传?

在现代视频监控和流媒体技术领域,EasyCVR视频融合云平台以其卓越的性能和灵活性,成为了跨区域、网络化视频监控综合管理的理想选择。作为TSINGSEE青犀视频“云边端”架构体系中的核心组件,私有化部署视频平台EasyCVR不仅能够实现视频数据的集…

【时间之外】IT人求职和创业应知【37】-AIGC私有化

目录 新闻一:2024智媒体50人成都会议暨每经20周年财经媒体峰会召开 新闻二:全球机器学习技术大会在北京召开 新闻三:区块链技术在金融领域的应用取得新突破 不知不觉的坚持了1个月,按照心理学概念,还要坚持2个月&am…

SqlServer 存储临时数据

WITH 子句中的 公用表表达式(CTE)、临时表(Temporary Table) 和 表变量(Table Variable) 都可以存储临时数据,但它们的使用场景、生命周期、作用范围和性能特性有所不同。下面是这三者之间的主要…

jmeter基础05_第1个http请求

本节课使用网站“httpbin.org”进行基础的http请求全流程。 请求获取httpbin.org的首页: 请求方法:GET URL:http://httpbin.org 参数:无 1、操作步骤 ① 打开jmeter:命令行窗口输入“jmeter”并回车。 ② 添加线程组…

SpringBoot+MyBatis+MySQL的Point实现范围查找

前言 最近做了一个功能,需要通过用户当前位置点获取指定范围内的数据。由于后端存储用的是 MySQL,故选择使用 MySQL 中的 Point 实现范围查找功能。ORM 框架用的是 MyBatis,MyBatis 原生并不支持 Point 字段与 POJO 的映射,需要自…

计算机网络中的数据包传输机制详解

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 引言 数据包的基本概念…

DAY110代码审计-PHP框架开发篇ThinkPHP版本缺陷不安全写法路由访问利用链

https://blog.csdn.net/m0_60571842/article/details/139057898 看这个原作者 知识点: 1、PHP框架学习-ThinkPHP-架构&调试&路由&接受2、PHP框架审计-ThinkPHP-不安全写法&版本漏洞 框架审计总结方向: 1、版本不安全写法怎么检测 -本…

【日志】力扣11.盛水最多的容器

2024.11.15 【力扣刷题】 11.盛水最多的容器 - 力扣&#xff08;LeetCode&#xff09; int maxArea(int* height, int heightSize) {int max 0;int V 0;int left 0;int right heightSize - 1;while (left < right) {if (height[left] > height[right]) {V height[r…

leetcode100:相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…