什么是 Bootloader?怎么把它移植到 STM32 上?

一、Bootloader 是啥?它都干了些啥?

想象一下你的 MCU(比如 STM32)是一个小机器人,上电之后第一件事,它不会立马开始“干正事”(运行你的主程序),而是先去运行一个“开场引导程序”——这就是 Bootloader。

它主要负责下面这些事:

  • 启动最基础的硬件:比如时钟、串口、Flash 这些,像是“穿衣洗脸”。
  • 判断要不要升级程序:比如你按了个按钮、发了个串口命令,它就不跳到主程序,而是“停在门口”,准备接收新程序。
  • 接收并写入新程序:它能从串口、USB、CAN、SD 卡等接收固件,然后擦掉旧程序,把新程序烧进去。
  • 最后跳转到主程序:一切准备就绪,它就把控制权交给你写的主程序,让它正式运行。

通俗讲,它就像是**“程序界的门房”**,开门、分发信件(固件)、开灯、安排进屋(跳转),全由它负责。


二、Bootloader 跟主程序的位置是怎么安排的?

在 STM32 中,Flash 是按地址划分的。一般我们这样安排:

Bootloader 区域: 0x08000000 ~ 0x08003FFF
主程序区域(App): 0x08004000 ~ Flash 结尾

也就是说,Bootloader 占前面 16KB 的空间(你可以设更多),主程序从后面接着跑。它们不会互相干扰。

Bootloader 的典型流程就像这样:

int main(void)
{HAL_Init();                    // 初始化硬件SystemClock_Config();         // 配置时钟MX_USART2_UART_Init();        // 初始化串口if (check_upgrade_flag())     // 判断是否需要升级{enter_upgrade_mode();     // 进入升级模式}jump_to_application();        // 跳到主程序区运行
}

三、Bootloader 做事情的重点是啥?

1. 固件怎么接收?

它可以从很多“入口”接收程序,比如:

  • 串口(UART)
  • USB(DFU 模式)
  • CAN、I2C、SPI
  • SD 卡、外部 Flash

接收过程里会做这些事:

  1. 检查程序是不是完整(比如校验 CRC)
  2. 擦掉旧程序(把 App 区的 Flash 擦了)
  3. 把新程序一点点写进去
  4. 写完了,打个勾:“升级完成了!”

2. 怎么跳转到主程序?

最关键的是要设置好跳转地址和栈指针。示例代码如下:

#define APP_ADDR 0x08004000  // 主程序起始地址typedef void (*pFunction)(void);
pFunction JumpToApplication;
uint32_t JumpAddress;HAL_DeInit();               // 关闭外设
__disable_irq();            // 禁用中断JumpAddress = *(__IO uint32_t*)(APP_ADDR + 4);
JumpToApplication = (pFunction)JumpAddress;__set_MSP(*(__IO uint32_t*)APP_ADDR); // 设置栈
JumpToApplication();                  // 跳转!

要注意:

  • 0x08004000 第一个 4 字节是主程序的栈指针(MSP)
  • 第二个 4 字节是主程序的启动地址(Reset_Handler)
  • 跳转之前要把中断关掉、外设关掉,不然主程序容易“误会”你还没交接完

四、怎么把 Bootloader 移植到 STM32 上?

如果你自己写 Bootloader,要让它配合你的主程序跑起来,大概分这几步:

Step 1:规划 Flash 分布

比如我们规划:

  • Bootloader 占 0x08000000 ~ 0x08003FFF(16KB)
  • 主程序从 0x08004000 开始

这样你就得去你的 App 工程里修改启动地址,不然你主程序会被烧到 Bootloader 区,冲突了。

Step 2:写 Bootloader 的功能

你得实现:

  • 初始化串口
  • 收数据 + 校验
  • 擦除 Flash
  • 写入新固件
  • 跳转主程序

Step 3:改主程序的配置

  • 启动文件 .s 或 .ld 文件中,把起始地址改成 0x08004000
  • 设置中断向量表地址偏移:SCB->VTOR = 0x08004000;

不改这些,你的主程序可能跳转不了,也收不到中断。

Step 4:验证!

Bootloader 烧进去 → 用它烧主程序 → 看能不能正常跳转、运行

记得保留串口 printf 打印,出问题好排查。


五、移植过程中常见的“坑”和解决方案

问题原因
跳转失败中断没关 / 地址没设对 / VTOR 没设置
Flash 写失败没解锁 / 写保护 / 地址错误
主程序不跑启动文件地址没改 / 向量表没偏移
烧完程序没反应没跳转、程序错烧、校验失败

解决方法:

  • 多用串口打印调试信息
  • 多测试单步跳转和Flash写入
  • 主程序先写一个最小的 Blinky(闪灯)测试跳转是否成功

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

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

相关文章

无人机避障——感知篇(Ego_Planner_v2中的滚动窗口实现动态实时感知建图grid_map ROS节点理解与参数调整影响)

处理器:Orin nx 双目视觉传感器:ZED2 实时感知建图方法:Vins Fusion Raycast (VIO与射线投影法感知定位加建图方法) 项目地址:https://github.com/ZJU-FAST-Lab/EGO-Planner-v2 【注意】:建…

26-计组-寻址方式

指令寻址与PC自增一、指令寻址方式定义:寻找下一条将要执行的指令地址的过程。 核心部件:程序计数器(PC),用于指示待执行指令的地址。 执行流程:CPU根据PC值从主存取指令。取指后,PC自动自增&am…

生成式对抗网络(GAN)模型原理概述

生成对抗网络(Generative Adversarial Network, GAN)是一种通过对抗训练生成数据的深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成,其核心思想源于博弈论中的零…

Vue和Element的使用

文章目录1.vue 脚手架创建步骤2.vue项目开发流程3.vue路由4.Element1.vue 脚手架创建步骤 创建一个文件夹 vue双击进入文件夹,在路径上输入cmd输入vue ui, 目的:调出图形化用户界面点击创建 9. 10.在vscode中打开 主要目录介绍 src目录介绍 vue项目启动 图形化界面中没有npm…

如何设置直播间的观看门槛,让直播间安全有效地运行?

文章目录前言一、直播间观看门槛有哪几种形式?二、设置直播间的观看门槛,对直播的好处是什么三、如何一站式实现上述功能?总结前言 打造一个安全、高效、互动良好的直播间并非易事。面对海量涌入的观众,如何有效识别并阻挡潜在的…

【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知

🧭 本文为 【SkyWalking 系列】第 3 篇 👉 系列导航:点击跳转 【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知 简介 介绍 SkyWalking 告警机制、告警规则格式以及如何通过 webhook 方式将告警信息发送到钉钉。 引入 服务响应超时…

关于 验证码系统 详解

验证码系统的目的是:阻止自动化脚本访问网页资源,验证访问者是否为真实人类用户。它通过各种测试(图像、行为、计算等)判断请求是否来自机器人。一、验证码系统的整体架构验证码系统通常由 客户端 服务端 风控模型 数据采集 四…

微服务集成snail-job分布式定时任务系统实践

前言 从事开发工作的同学,应该对定时任务的概念并不陌生,就是我们的系统在运行过程中能够自动执行的一些任务、工作流程,无需人工干预。常见的使用场景包括:数据库的定时备份、文件系统的定时上传云端服务、每天早上的业务报表数…

依赖注入的逻辑基于Java语言

对于一个厨师,要做一道菜。传统的做法是:你需要什么食材,就自己去菜市场买什么。这意味着你必须知道去哪个菜市场、怎么挑选食材、怎么讨价还价等等。你不仅要会做菜,还要会买菜,职责变得复杂了。 而依赖注入就像是有一…

skywalking镜像应用springboot的例子

目录 1、skywalking-ui连接skywalking-oap服务失败问题 2、k8s环境 检查skywalking-oap服务状态 3、本地iidea启动服务连接skywalking oap服务 4、基于apache-skywalking-java-agent-9.4.0.tgz构建skywalking-agent镜像 4.1、Dockerfile内容如下 4.2、AbstractBuilder.M…

3. java 堆和 JVM 内存结构

1. JVM介绍和运行流程-CSDN博客 2. 什么是程序计数器-CSDN博客 3. java 堆和 JVM 内存结构-CSDN博客 4. 虚拟机栈-CSDN博客 5. JVM 的方法区-CSDN博客 6. JVM直接内存-CSDN博客 7. JVM类加载器与双亲委派模型-CSDN博客 8. JVM类装载的执行过程-CSDN博客 9. JVM垃圾回收…

UnityShader——SSAO

目录 1.是什么 2.原理 3.各部分解释 2.1.从屏幕空间到视图空间 2.2.以法线半球为基,获取随机向量 2.3.应用偏移,并将其转换为uv坐标 2.4.获取深度 2.5.比较并计算贡献 2.6.最后计算 4.改进 4.1.平滑过渡 4.2.模糊 5.变量和语句解释 5.1._D…

【设计模式】外观模式(门面模式)

外观模式(Facade Pattern)详解一、外观模式简介 外观模式(Facade Pattern) 是一种 结构型设计模式,它为一个复杂的子系统提供一个统一的高层接口,使得子系统更容易使用。 外观模式又称为门面模式&#xff0…

【6.1.1 漫画分库分表】

漫画分库分表 “数据量大了不可怕,可怕的是不知道如何优雅地拆分。” 🎭 人物介绍 架构师老王:资深数据库架构专家,精通各种分库分表方案Java小明:对分库分表充满疑问的开发者ShardingSphere师傅:Apache S…

Tomcat问题:启动脚本startup.bat中文乱码问题解决

一、问题描述 我们第一次下载或者打开Tomcat时可能在控制台会出现中文乱码问题二、解决办法 我的是8.x版本的tomcat用notepad打开:logging.properties 找到:java.util.logging.ConsoleHandler.encoding设置成GBK,重启tomcat即可

Linux中Gitee的使用

一、Gitee简介:Gitee(码云)是中国的一个代码托管和协作开发平台,类似于GitHub或GitLab,主要面向开发者提供代码管理、项目协作及开源生态服务。适用场景个人开发者:托管私有代码或参与开源项目。中小企业&a…

Oracle大表数据清理优化与注意事项详解

一、性能优化策略 1. 批量处理优化批量大小选择: 小批量(1,000-10,000行):减少UNDO生成,但需要更多提交次数中批量(10,000-100,000行):平衡性能与资源消耗大批量(100,000行):适合高配置环境,但需监控资源使…

Anaconda及Conda介绍及使用

文章目录Anaconda简介为什么选择 Anaconda?Anaconda 安装Win 平台macOS 平台Linux 平台Anaconda 界面使用Conda简介Conda下载安装conda 命令环境管理包管理其他常用命令Jupyter Notebook(可选)Anaconda简介 Anaconda 是一个数据科学和机器学…

外包干了一周,技术明显退步

我是一名本科生,自2019年起,我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定,但日复一日的重复性工作让我逐渐陷入了舒适区,失去了前进的动力。两年的时光匆匆流逝,我却在原地踏步,技术没有丝毫…

【QT】多线程相关教程

一、核心概念与 Qt 线程模型 1.线程与进程的区别: 线程是程序执行的最小单元,进程是资源分配的最小单元,线程共享进程的内存空间(堆,全局变量等),而进程拥有独立的内存空间。Qt线程只要关注同一进程内的并发。 2.为什么使用多线程…