教育网站,龙岩网站优化费用,it程序员需要什么学历,贵港市建设局网站STM32 启动执行逻辑与代码烧入方法详解#xff1a;从底层原理到实操落地背景概要STM32启动和执行的核心逻辑链条代码烧入到STM32的途径方法结束语背景概要
在学习STM32时候我们知道代码需要通过一些下载器#xff08;如ST-Link、J-Link#xff09;或者串口下载烧入到STM32芯… STM32 启动执行逻辑与代码烧入方法详解从底层原理到实操落地背景概要STM32启动和执行的核心逻辑链条代码烧入到STM32的途径方法结束语背景概要
在学习STM32时候我们知道代码需要通过一些下载器如ST-Link、J-Link或者串口下载烧入到STM32芯片内从而让芯片执行我们的代码逻辑链条。但是我们是否有想过这样问题STM32到底是如何知道我们需要下载烧入程序如何知道我们要运行程序STM32在执行我们程序之前需要做什么工作启动它时候它干了什么STM32在启动和执行我们程序时候它的工作流程逻辑底层原理到底是什么它是怎么一步步工作的又或者说当我们学习STM32时候不免的接触到的“中断向量表”“ “boot引脚或者说Bootloader程序”它们到底是什么有什么用在STM32工作时候扮演着一个什么样的角色这也是本文所聚焦和要回答的内容。
本文总共聚焦两个问题
代码如何烧入到STM32里面其途径是什么当代码烧入后STM32上电或复位后的启动和执行逻辑
本文将以上面聚焦的问题进行详细形象生动化的回答不仅能让初学者能理解代码是如何被运行起来的还能让有基础的读者能从更加深刻化理解STM32为学习它打下更坚固的基础
本文将会以两个视角来展开对于STM32工作的底层逻辑链条讲解
第一个视角将以稍微专业的名词术语讲解这方面知识给具备这方面基础的读者节约时间使其迅速了解STM32启动和执行的核心逻辑链条、第二个视角将会以形象的比喻来生动化这方面知识让读了第一视角还有些疑惑的读者彻底理解同时让刚刚学习这方面读者也能从零理解它。
STM32启动和执行的核心逻辑链条
STM32启动和执行的核心逻辑链条流程图可以大概的归纳为下面这个流程图 下面进行这个流程图的详细讲解 当你的代码烧入到STM32也就是存储到STM32的Flash区域后当STM32上电或者复位后STM32的CPU就会访问STM32单片机的起始地址0x0000 0000 STM32是32位的所以内存地址就是32个bit位经过STM32芯片的存储器重映射CPU从起始访问地址0x0000 0000到访问为STM32的ROM区域中三个存储器之一而具体访问哪一个存储器取决于STM32的boot引脚的配置这点我们可以参考STM32手册的boot引脚配置图如下图 之后当CPU访问了其中某一个存储器后这里我们以访问了Flash存储器为例子其他同理当CPU访问Flash存储器地址位0x0800 0000后就会发现位于Flash起始地址0x0800 0000上的中断向量表接下来CPU将完成四个工作也就是中断向量表的任务 ①初始化栈顶指针 (MSP)CPU首先读取向量表的第一个字4字节地址0x0800 0000并将这个值赋给主堆栈指针(MSP)。这是为后续执行C代码建立栈空间的基础没有它程序无法运行。 ②找到复位入口CPU紧接着读取第二个字地址0x0800 0004这个值就是复位服务程序的入口地址。 ③跳转执行_mianCPU然后跳转到这个“复位服务程序”的地址开始执行。这个函数是由芯片厂商提供的通常由汇编编写是启动流程的真正起点复位服务程序会调用一个非常重要的函数 __main注意这不是我们的main()函数。它是由编译器自动生成负责搭建C语言运行环境。 它主要做两件大事 1.初始化数据段 (.data段)将已经初始化的全局变量和静态变量的初始值从Flash ROM中拷贝到RAM中去。因为Flash是只读的而变量需要在RAM中被修改。 2.清零零初始化段 (.bss段)将未初始化或显式初始化为0的全局变量和静态变量所在的内存区域清零。 ④执行程序代码main__main函数完成所有初始化工作后CPU最终会自动调用以及不断扫描执行用户的 main() 函数这块代码位于Flash存储器内。 如果你不是很理解上面CPU的几个工作的话下面请看这个比喻 我们先设定一个背景 空的快递仓库 STM32的内存RAM里面有很多货架地址但现在是空的。 仓库管理员 STM32。 文件中断向量表 新来的工人 CPU。 总部档案室 Flash存储器里面存放着永久性的文件和指令你的程序代码和初始值。 ① 初始化栈顶指针 (MSP)搭建“临时工作台” 专业解释 CPU从向量表第一个条目读取值并赋给MSP寄存器建立栈空间。 形象解释 工人CPU上班第一天仓库管理员STM32告诉工人CPU产生的垃圾和临时包裹局部变量、函数调用记录具体放在哪里要去看一个文件中断向量表告诉他这个文件在他的办公室桌子上地址0x0800 0000工人来到他的办公室桌子上地址0x0800 0000了看到了文件上中断向量表规定了“工人CPU产生的垃圾和临时包裹局部变量、函数调用记录必须放在的特定的位置。”工人CPU害怕记不住于是乎拿出来一个小本子记录MSP寄存器它把这个文件上说的地方记下来了也就是对MSP的初始值设置完成了接下来当 工人产生了一个临时包裹比如调用一个函数有一个局部变量 int a;他就把它堆在“货架 2000 1000”上。 同时他在小本本上把当前堆放点更新为 2000 0FFC向前挪一个位置。因为他知道下一个包裹要往前面的空位堆不能堆在同一个地方。当他处理完这个函数需要把临时包裹扔掉时他就根据小本本的记录找到最近堆的那个包裹把它清理掉。然后在小本本上把堆放点又改回 2000 1000。这个过程就是栈的“后进先出”。 为什么必须做 没有这个工作台工人就没地方放临时包裹局部变量、也没法记录干到哪了函数调用返回地址整个仓库的运营将瞬间瘫痪。这是一切C代码执行的基础。 ———————————————————————————————————— ②找到复位入口: 找到“启动专家” 专业解释CPU从向量表第二个条目读取复位服务程序的入口地址。 形象解释 当工人把“临时工作台”搭建好后也就是完成了初始化栈顶指针 MSP仓库管理员STM32给工人CPU下达了一个指令去办公室复位向量的地址找到启动专家复位服务程序让他干活。 为什么必须做 工人自己不知道如何准备仓库环境他必须找到一个专业的负责人来执行一套复杂的准备工作。 ———————————————————————————————————— ③跳转执行_mian“启动专家”干活搭建C语言环境 专业解释跳转到复位服务程序执行它调用__main函数来初始化.data和.bss段。 形象解释 当工人找到了“启动专家”复位服务程序叫他干活后。专家他并没有自己干活而是叫来了他的两位得力助手__main函数 ——助手A搬运档案初始化.data段 专家发现有些每天都要用的常用文件已初始化的全局变量如 int a 5;的原始档案还锁在总部档案室Flash 里。 他命令助手A“去档案室把这些常用文件的复印件全部搬到仓库的日常办公区RAM 来这样我们平时修改数据就方便了。”因为档案室是只读的不能直接在上面写字。 助手B清理场地初始化.bss段 专家又发现仓库里规划好的一片新场地未初始化的全局变量如 int b;现在还堆满了建筑垃圾随机值。 ——他命令助手B“把这片新场地全部打扫干净清零 这样我们以后就可以直接使用了。 工人CPU立刻走到仓库最里面的2000 1000号货架挂上一个“临时物品堆放起点”的牌子并在他的小本本MSP寄存器上记下这个位置。 为什么必须做 这是C语言程序能正确运行的隐藏前提。如果不把初始值从Flash拷到RAM变量就没有正确的值如果不清理RAM的垃圾值未初始化的变量就是随机的程序行为会不可预测。 ———————————————————————————————————— 最后当这个工厂在不断运行时候如果出现了突发事件各种中断的那么工人CPU将会再次到仓库管理员STM32的办公室桌子上地址0x0800 0000去阅读那份文件中断向量表这个文件就会详细告诉当遇到什么类型的突发事件各种中断的应该去找什么部分各个中断的处理函数Handler去负责。 boot引脚在我们STM32单片机的下图红色框区域内它的状态由跳线帽所决定它是配置STM32上电后CPU根据存储器重映射到ROM的哪一个存储器的核心依据只有在上电或者复位时候STM32单片机才会检查boot引脚的配置从而确定该去ROM的哪个存储器 下面这个图详细的讲解了STM32的两大类存储器ROM和RAM以及它们各自具体的存储器和用途 相信你读完上面的这个比喻后就能彻底了弄懂了STM32启动和执行的核心逻辑链条以及我们开头所说的那几个问题了
代码烧入到STM32的途径方法
根据上面的STM32启动和执行的核心逻辑链条我们知道了STM32的CPU最后会不断的扫描Flash里面存储的我们的main函数代码也就是说我们如果想要代码被STM32执行就要把代码烧入到STM32的Flash区域内。而代码烧入到STM32的Flash途径主要有两种
直接法通过下载器如ST-Link下载——把编译好代码连接上位机电脑和单片机STM32然后通过编译器如Keil5下载按钮直接把代码程序下载到Flash区域这也是我们经常 用的方法间接法通过串口下载——把编译好的代码先下载至系统存储器里再经过系统存储器的Bootloader程序把代码刷新下载到Flash里面 也就是可以总结为下面这个流程图 相信对于直接法大家已经不陌生了那么我们重点来看一下间接法 间接法要求我们通过串口下载也就是把代码先下载到系统存储器然后再这个存储器内由Bootloader程序帮我们完成把代码下载刷新到Flash里面也就是要求我们两步走 ①配置STM32上电复位后是系统存储器 ②通过串口下载并且执行Bootloader程序把代码下载刷新到Flash里面 对于第一步而言也就是我们只需要根据上文我们说的通过跳线帽把BOOT0置1BOOT1置0并且按下复位按键就能使得单片机上电后CPU访问到ROM的系统存储器 对于第二步而言我们得用串口将电脑和STM32的USART1连接在一起通过连接USB转TTL模块到STM32的USART1然后在电脑上打开烧录工具如STM32CubeProgrammer, Flash Loader Demonstrator等选择正确的串口号设置波特率常用115200然后进行下载就好了 由于我们前面已经做了前置工作STM32上电复位后CPU访问的是系统存储器而系统存储器里面又内置了Bootloader程序它收到串口下载的代码后将会自动执行这段程序从而完成把代码下载到Flash里面。 接着如果要执行Flash里面代码就需要通过跳线帽把BOOT0置0BOOT1置0然后复位让CPU访问Flash然后执行代码
以上就是代码烧入到STM32的两种途径方法。 内置的Bootloader程序是什么这段Bootloader代码是由ST公司在芯片生产过程中就预先固化在芯片内部一个特殊、受保护的ROM区域称为“系统存储器”。用户无法修改或擦除它这段代码的唯一功能就是与外界通信接收新的程序数据并将其写入到用户Flash内存的指定位置。要运行这段Bootloader程序只需要CPU从“系统存储器”启动也就是BOOT0置1BOOT1置0在上文表格有提及然后给芯片复位按下NRST复位键。 当Bootloader运行后干什么它会通过你选择的接口这里是串口等待主机通常是电脑上的烧录软件发送指令也就是下载你的代码当Bootloader收到指令后会回复一个应答信号ACK0x79表明连接成功Bootloader已就绪然后将会执行以下操作: 擦除命令告诉Bootloader擦除Flash的特定扇区。 写命令告诉Bootloader准备接收数据并指定要写入的Flash地址。校验命令读取已写入的数据进行校验。执行命令让芯片从用户Flash地址开始运行程序。 所有数据发送并写入完成后电脑串口的烧入软件会发送一个“跳转”或“执行”命令。Bootloader会复位外设然后将CPU的程序计数器PC指向用户Flash的起始地址通常是0x08000000。 但是最后非常重要的一步的是你要执行你的代码需要将BOOT0引脚重新接回低电平GND并再次复位芯片。这样CPU就会从用户Flash启动运行你刚刚下载的新程序。 结束语
在构思和撰写这篇文章的过程中我始终在思考一个问题如何让那些尚不了解或对STM32启动与执行逻辑感到陌生的朋友能够真正理解其中的原理不仅明白“怎么做”更懂得“为什么这样做”。
于是我尝试从一个初学者的视角出发一步步拆解STM32的启动流程与程序运行机制并重点解析了两种常见的程序烧录方式背后的原理。我的目标是希望帮助你从根本上建立清晰的认识——不再只是会写代码、会下载程序而是真正看懂每一步背后发生了什么。
作为一名STM32的初学者我深知入门时遇到的困惑与障碍。正因为自己走过弯路才更希望后来者能少一些迷茫。在写作的四个多小时里我反复查阅资料、梳理逻辑、构思比喻只为了把复杂的概念讲得透彻、生动。虽然文章中难免仍有不足之处但我衷心希望它能够为你打开一扇理解底层原理的窗。
如果你觉得这篇文章对你有所帮助请不妨点一个赞——你的认可是我持续分享的最大动力。感谢你的阅读期待与你共同进步