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

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

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 在开始执行应用程序之前,所有硬件和系统资源都被正确初始化,保证了稳定的运行环境。

相关文章:

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

STM32 的启动过程是一个精细而系统的流程,它涉及从芯片复位开始,到初始化系统、设置时钟、运行主程序等一系列步骤。下面详细介绍 STM32 启动过程的主要步骤。 1. Boot引脚设定 STM32 系列芯片有多个启动模式,这些模式是通过引脚&#xff0…...

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…...

网络安全:数字时代的守护盾

在21世纪的今天,互联网已经渗透到我们生活的方方面面,从社交互动、在线购物、远程办公到智能家居,无一不彰显着数字技术的便捷与高效。然而,随着网络空间的日益扩大,网络安全问题也日益凸显,成为了一个不容…...

vue 中监听页面尺寸变化就调用函数

方法一:使用 window.onresize 结合 Vue 实例的生命周期钩子(不推荐,存在覆盖风险) 虽然可以直接使用原生的 window.onresize 事件来监听窗口大小变化,但这种方式在 Vue 项目中有一些局限性,因为如果在多个…...

全面解读 USB Key:定义、使用场景、加密技术及 Java 实现

文章目录 **什么是 USB Key?****USB Key 的使用场景**1. **身份认证**2. **数字签名**3. **数据加密与解密**4. **证书管理** **USB Key 解决的问题****USB Key 使用的加密技术**1. **对称加密**2. **非对称加密**3. **哈希算法**4. **数字签名**5. **PKI&#xff0…...

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想:分而治之 React的组件按照不同的方式可以分成类组件: 划分方式一(按照组件的定义方式) 函数组件(Functional Component )和类组件(Class Component); …...

8 软件项目管理

软件项目管理 1、软件项目管理概念1.1 软件项目管理内容1.2 软件项目管理的4P要素人员产品过程项目 2、软件项目度量2.1 软件项目度量定义及度量方法2.2 面对规模的度量2.3 面对功能的度量UFC相关的五类组件14个复杂性调节因素 F i F_i Fi​一个功能点开发代码行数 2.4 软件估算…...

【移除bpmn-js流程图中的logo图标】

在node_modules文件中查找 bpmn-js\dist\bpmn-modeler.development.js bpmn-js\lib\BaseViewer.js在文件中搜索linkMarkup var linkMarkup <a href"http://bpmn.io" target"_blank" class"bjs-powered-by" title"Powered by bpmn.i…...

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…...

ISAAC SIM踩坑记录--ROS2相机影像发布

其实这个例子官方和大佬NVIDIA Omniverse和Isaac Sim笔记5&#xff1a;Isaac Sim的ROS接口与相机影像、位姿真值发布/保存都已经有详细介绍了&#xff0c;但是都是基于ROS的&#xff0c;现在最新的已经是ROS2&#xff0c;这里把不同的地方简单记录一下。 搭建一个简单的场景&a…...

CSS Module:告别类名冲突,拥抱模块化样式(5)

CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具&#xff08;如 webpack&#xff09;将 CSS 样式切分为更加精细的模块&#xff0c;并在编译时将类名转换为唯一的标识符&#xff0c;从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。 1. 思…...

JavaSE常用API-日期(计算两个日期时间差-高考倒计时)

计算两个日期时间差&#xff08;高考倒计时&#xff09; JDK8之前日期、时间 Date SimpleDateFormat Calender JDK8开始日期、时间 LocalDate/LocalTime/LocalDateTime ZoneId/ZoneDateTIme Instant-时间毫秒值 DateTimeFormatter Duration/Period...

AutoDL上进行tensorboard可视化

1.下载SSH隧道工具 输入ssh指令、ssh密码、代理到本地端口、代理到远程端口 2.在实例中执行&#xff1a;export https_proxyhttp://127.0.0.1:1080 3.在实例中执行&#xff1a;tensorboard --port 6006 --logdir work_dirs 4.打开 http://localhost:6006/ 即可...

20.UE5UI预构造,开始菜单,事件分发器

2-22 开始菜单、事件分发器、UI预构造_哔哩哔哩_bilibili 目录 1.UI预构造 2.开始菜单和开始关卡 2.1开始菜单 2.2开始关卡 2.3将开始菜单展示到开始关卡 3.事件分发器 1.UI预构造 如果我们直接再画布上设计我们的按钮&#xff0c;我们需要为每一个按钮进行编辑&#x…...

【C语言指南】C语言内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言&#xff0c;为程序员提供了对内存的直接控制能力。这种对内存…...

前海华海金融创新中心的工地餐点探寻

​前海的工地餐大部分都是13元一份的哈。我在前海华海金融创新中心的工地餐点吃过一份猪杂饭&#xff0c;现做13元一份。我一般打包后回公司吃或直接桂湾公园找个环境优美的地方吃饭。 ​我点的这份猪杂汤粉主要是瘦肉、猪肝、肉饼片、豆芽和生菜&#xff0c;老板依旧贴心问需要…...

索引及练习

1.索引 &#x1f4d6;什么是索引&#xff1f; 1. 索引是对数据库一列或者多列的值进行排序的一种结构。 2. 索引的建立会大大提高 mysql 的检索速度。 3. 如果想高效的使用 mysql, 而且数据量大时&#xff0c;需要花费事件去设计索引&#xff0c;建立优秀的索引规 则&a…...

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

汽车使用云快充1.6 1.5协议&#xff0c;单车用的铁塔协议 前端uniapp、后端jeecgbootvue2...

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…...

MacOS编译hello_xr——记一次CMake搜索路径限制导致的ANDROID_NATIVE_APP_GLUE not found

首先,由于之前使用过Unity, 系统已经装好了android SDK和NDK, 所以在hello_xr文件夹下, 用local.properties文件来设置系统中二者的路径: sdk.dir/Applications/Unity/Hub/Editor/2022.3.48f1c1/PlaybackEngines/AndroidPlayer/SDK/ # ndk.dir/Applications/Unity/Hub/Editor/…...

stm32cubeide+freertos+c/c++混合编程实战避坑指南

1. STM32CubeIDE与FreeRTOS环境搭建避坑指南 第一次用STM32CubeIDE配置FreeRTOS时&#xff0c;我对着时钟源选项纠结了半小时。后来发现这个选择直接影响系统稳定性——选错时钟源会导致任务调度像喝醉了一样飘忽不定。实测推荐用TIM6替代默认的SysTick作为时基&#xff0c;原因…...

OOM线上问题排查

场景&#xff1a; 项目中有一个接口&#xff0c;会进行全表查询&#xff0c;查出来3万条&#xff0c;查一次不会导致oom&#xff0c;但是频繁调用这个接口&#xff0c;上一次调用还没有来得及进行垃圾回收&#xff0c;下一次接口调用又来了&#xff0c;又有3万条数据&#xff0…...

像素时装锻造坊:零基础5分钟快速部署,开启你的AI像素时装设计之旅

像素时装锻造坊&#xff1a;零基础5分钟快速部署&#xff0c;开启你的AI像素时装设计之旅 1. 为什么选择像素时装锻造坊 想象一下&#xff0c;你正在设计一款复古风格的像素游戏&#xff0c;需要为角色制作各种皮革时装。传统方法要么需要专业的美术功底&#xff0c;要么得花…...

Todo 时代结束了:当 AI 开始自己管项目,人类管理者该管什么?

AI 不再只是执行你的指令&#xff0c;它开始管理自己的项目了。这是 Anthropic Claude Code 团队成员 Thariq Shihipar 在 2026 年悄悄发出的一条技术更新公告里&#xff0c;藏着的一个巨大信号。大多数人划过去了&#xff0c;没有停下来。Claude Code 宣布&#xff1a;将 Todo…...

PCIe 4.0 vs 内存总线:为什么你的NVMe SSD速度上不去?

PCIe 4.0与内存总线带宽博弈&#xff1a;揭开NVMe SSD性能瓶颈的真相 当你花大价钱购入一块标称读取速度7000MB/s的高端NVMe SSD&#xff0c;实际测试却发现速度只有标称值的一半时&#xff0c;这种落差感就像买了跑车却只能在市区堵车。问题往往不在SSD本身&#xff0c;而是隐…...

Arduino LSM6DS3驱动库深度解析:寄存器级IMU开发指南

1. Arduino_LSM6DS3库深度解析&#xff1a;面向嵌入式工程师的LSM6DS3惯性测量单元驱动开发指南 1.1 库定位与工程价值 Arduino_LSM6DS3是专为Arduino Nano 33 IoT和Arduino Uno WiFi Rev2两款板卡设计的LSM6DS3惯性测量单元&#xff08;IMU&#xff09;驱动库。该库并非通用型…...

告别动物实验?AI设计抗体成功率低怎么办?聊聊RFdiffusion的局限与未来优化方向

AI抗体设计的突破与挑战&#xff1a;从RFdiffusion看技术瓶颈与未来路径 当David Baker团队在bioRxiv上发布利用RFdiffusion实现抗体原子级精度从头设计的论文时&#xff0c;整个AI制药领域为之振奋。这项技术突破意味着&#xff0c;我们可能正站在抗体药物研发范式转变的临界点…...

ZYNQ双核通信必看:共享内存的Cache一致性处理实战

ZYNQ双核通信中的Cache一致性实战指南 在嵌入式系统开发中&#xff0c;多核处理器间的数据共享一直是开发者面临的挑战之一。Xilinx ZYNQ系列SoC凭借其ARM双核Cortex-A9架构与可编程逻辑的完美结合&#xff0c;为高性能嵌入式应用提供了强大支持。然而&#xff0c;当两个核心需…...

别再被机械按键坑了!FPGA消抖模块Verilog代码保姆级解析(附仿真波形)

FPGA按键消抖实战&#xff1a;从原理到Verilog实现的深度解析 刚接触FPGA开发的朋友们&#xff0c;一定遇到过这样的困扰——明明按下了按键&#xff0c;系统却像没反应一样&#xff1b;或者只按了一次&#xff0c;设备却识别出多次触发。这背后隐藏着一个看似简单却至关重要的…...

3步解锁:让老旧电脑流畅运行Windows 11的终极精简方案

3步解锁&#xff1a;让老旧电脑流畅运行Windows 11的终极精简方案 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 在数字时代&#xff0c;系统性能直接影响工作效…...