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_Handler 或 SystemInit 之后,通常会调用 C 语言运行时初始化函数,如 _init(),以便为 C 语言程序做好准备。这些初始化过程可能包括:
- 初始化
stdio,为输入输出提供支持。 - 设置一些 C 语言相关的运行时参数。
7. 主函数(_main)
最后,Reset_Handler 会跳转到 C 语言的主函数 _main,这是程序的入口点。此时,硬件和系统时钟已经准备就绪,C 库已初始化,栈指针也已经指向正确的位置,程序就可以开始执行了。
主函数 _main 通常是应用程序的入口,程序的实际逻辑、任务调度等都从这里开始。
总结
STM32 启动过程中的每一步都有其独特的作用,从硬件引脚设置、栈指针初始化,到异常中断设置、时钟初始化、C 库函数调用,最终跳转到 main 函数。这个过程确保了 MCU 在开始执行应用程序之前,所有硬件和系统资源都被正确初始化,保证了稳定的运行环境。
相关文章:
STM32 学习笔记-----STM32 的启动过程
STM32 的启动过程是一个精细而系统的流程,它涉及从芯片复位开始,到初始化系统、设置时钟、运行主程序等一系列步骤。下面详细介绍 STM32 启动过程的主要步骤。 1. Boot引脚设定 STM32 系列芯片有多个启动模式,这些模式是通过引脚࿰…...
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࿰…...
❤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 (1)springboot和Elasticsearch的版本对应关系如下,请看版本对应: 注意安装对应版本,否则可能会出现一些未知的错误。 (2)拉取镜像 docker pull elasticsearch:7…...
ISAAC SIM踩坑记录--ROS2相机影像发布
其实这个例子官方和大佬NVIDIA Omniverse和Isaac Sim笔记5:Isaac Sim的ROS接口与相机影像、位姿真值发布/保存都已经有详细介绍了,但是都是基于ROS的,现在最新的已经是ROS2,这里把不同的地方简单记录一下。 搭建一个简单的场景&a…...
CSS Module:告别类名冲突,拥抱模块化样式(5)
CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具(如 webpack)将 CSS 样式切分为更加精细的模块,并在编译时将类名转换为唯一的标识符,从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。 1. 思…...
JavaSE常用API-日期(计算两个日期时间差-高考倒计时)
计算两个日期时间差(高考倒计时) JDK8之前日期、时间 Date SimpleDateFormat Calender JDK8开始日期、时间 LocalDate/LocalTime/LocalDateTime ZoneId/ZoneDateTIme Instant-时间毫秒值 DateTimeFormatter Duration/Period...
AutoDL上进行tensorboard可视化
1.下载SSH隧道工具 输入ssh指令、ssh密码、代理到本地端口、代理到远程端口 2.在实例中执行:export https_proxyhttp://127.0.0.1:1080 3.在实例中执行: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预构造 如果我们直接再画布上设计我们的按钮,我们需要为每一个按钮进行编辑&#x…...
【C语言指南】C语言内存管理 深度解析
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言,为程序员提供了对内存的直接控制能力。这种对内存…...
前海华海金融创新中心的工地餐点探寻
前海的工地餐大部分都是13元一份的哈。我在前海华海金融创新中心的工地餐点吃过一份猪杂饭,现做13元一份。我一般打包后回公司吃或直接桂湾公园找个环境优美的地方吃饭。 我点的这份猪杂汤粉主要是瘦肉、猪肝、肉饼片、豆芽和生菜,老板依旧贴心问需要…...
索引及练习
1.索引 📖什么是索引? 1. 索引是对数据库一列或者多列的值进行排序的一种结构。 2. 索引的建立会大大提高 mysql 的检索速度。 3. 如果想高效的使用 mysql, 而且数据量大时,需要花费事件去设计索引,建立优秀的索引规 则&a…...
java版嘎嘎快充汽车单车充电系统源码系统jeecgboot
汽车使用云快充1.6 1.5协议,单车用的铁塔协议 前端uniapp、后端jeecgbootvue2...
vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果
说明 vue路由切换时,当前页面左侧和右侧容器分别从两侧滑出,新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器,通过<transition>组件,效果只能对页面根容器有效…...
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/…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
