单片机 Bootloade与二进制文件的生成
单片机的 Bootloader 是一种特殊的程序,负责在单片机上电后初始化硬件、更新用户应用程序(固件),并将控制权移交给用户程序。以下是其运行机制和关键流程的详细说明:
1、单片机 Bootloader 的核心作用
固件更新:通过通信接口(如 UART、USB、CAN、I2C、SPI 等)接收新固件,写入 Flash 存储。
程序跳转:根据条件(如按键触发、标志位)决定运行 Bootloader 还是用户程序。
硬件初始化:配置时钟、外设、通信模块等。
安全校验:对固件进行 CRC 校验或数字签名验证,防止错误或恶意代码写入。.
2、单片机 Bootloader 的运行流程
1.上电启动
硬件复位
单片机上电后,CPU 从固定地址(如0x00000000)开始执行代码,通常指向Bootloader 的入口。
部分单片机(如 STM32)支持从不同存储区域启动(通过 BOOT 引脚选择启动 Bootloader 或用户程序)。
初始化硬件
配置时钟、GPIO、通信接口(如 UART/USB)、Flash 控制器等。
2.判断运行模式
Bootloader 模式:
检测触发条件(如按键按下、特定引脚电平、通信端口收到特定指令)。
若触发条件满足,进入固件更新流程。
用户程序模式:
若未触发,直接跳转到用户程序起始地址(如0x08000000,需与应用程序的链接脚本一致)。
3、固件更新流程
3.1 等待接收固件数据
通知上位机(PC 或主机设备)开始传输固件。
固件通常以二进制(.bin)或十六进制(.hex)格式传输,包含起始地址、数据长度、校验信息。
3.2 擦除 Flash
擦除用户程序存储区。
3.3 写入 Flash
按数据包逐块写入 Flash,同时进行 CRC 校验。
若校验失败,重传或报错。
3.4 写入 Flash
写入结束标志,复位或跳转到用户程序。
3.5 跳转到用户程序
关闭 Bootloader 使用的外设。
设置APP起始地址。
4、 Bootloader 设计的关键技术
4.1 存储空间划分
如一个芯片FLASH大小为512K
Bootloader 区: 占用 Flash 起始部分(如 0x00000000~0x00010000),大小按需制定,需在编译时指定。
用户程序区: 从 Bootloader 区之后开始(如 0x00010000~0x0007F000)。
配置区: 在 Flash 或 EEPROM 中存储标志,通常运用最后一页(4K)作为配置区,大小按需制定。在配置内可以存储固件升级标志、固件升级方式、固件大小、固件检验值、固件版本号等。(如0x0007F000~ 0x00080000)

4.2 安全机制
CRC 校验: 确保数据传输完整性。
数字签名: 使用非对称加密(如 RSA)验证固件来源。
写保护: 防止误写 Bootloader 区域(通过 Flash 保护位)。
5. 单片机 Bootloader 实现实例
以新塘M480芯片为例。升级方式可以通过串口、CAN、蓝牙、U盘等信道。
当前处于APP重新中:
步骤1:上位机触发固件升级。
步骤2:擦除配置区。对于Flash来说最小擦写单位为 块(Block) 或 扇区(Sector) 擦除(如 4KB、64KB)。故最小擦除4K。将配置区数据写入配置区。
步骤3:设置中断向量映射地址,将向量地址映射为0x00000000。
步骤4:进行系统复位。
切换到bootload中
步骤5:初始化外设。
步骤6:读取配置区标志。
步骤7:根据配置区配置进行后续工作,是进行固件升级还是跳入APP执行。
步骤8:在进行固件升级的情况下获取固件升级包内容。
步骤9:接收到一定数量的配置信息,如4K(FLASH最小擦写单位),在写入之前可以先擦除需要写的内存,写入后需要再读出来进行验证。
步骤10:完成最后一包数据的写入。
步骤11:为跳转到APP做准备。清除外设配置、设置中断向量映射地址,将向量地址映射到APP地址。
步骤12:进行系统复位。
伪代码操作
\\APP中的运行代码
失能中断;
iap_flag = 0xAA; //设置升级标志
擦除FLASH(配置页地址,配置页大小);
写入FLASH((配置页地址,配置页大小,配置数据);
向量映射(0x00000000);
系统复位;
使能中断;
\\boot中的运行代码
初始化外设;
失能中断;
读取FLASH(配置页地址,配置页大小,配置数据)
使能中断;
各类校验等操作;
发送升级原因、升级包数量、固件大小等;
发送升级包请求;
获取到一定数量的升级包;
将升级包擦写读FLASH;
完成最后一包的写入;
发送升级结果;
清除外设设置;
向量映射(APP开始地址);
系统复位;
6、烧录文件类型
1.hex 文件
Intel HEX 格式,包含程序代码和烧录地址信息。
由 IDE(如 Keil、STM32CubeIDE)编译生成。
适用工具:ST-Link Utility、J-Flash等。
2.bin 文件
纯二进制文件,仅包含代码数据,需手动指定烧录地址。
适用工具:STM32CubeProgrammer、J-Link Commander、串口烧录工具、NuMicro ICP Programming Tool等。
3. 注意事项
烧录地址:
.bin文件需指定正确的起始地址(如 Flash 起始地址 0x08000000)。
.hex文件已包含地址信息,无需手动设置。
通常Bootloader代码与APP实现代码分开实现。则boot.bin与app.bin需要进行合并。
IMAGE.bin = boot.bin + app.bin;
DATA.bin = 配置信息;

若需要通过各类信道升级固件。
UPDATE.bin = 配置信息 + app.bin;

若配置区长度固定也可以写入文件低地址,应用程序区写高地址。由读取升级固件实现方式决定。
7、合并文件实现
利用python实现
这里主要阐述原理
if __name__ == "__main__": #主函数
#利用sys模块引入参数 import sys
sys.argv[0] #第一个参数
sys.argv[1] #第二个参数
sys.argv[n+1] #第n个参数
#获取到需要的参数如:需要合成的文件1、需要合成的文件2、每页大小、输出的文件名、版本号等、CRC校验等、输出的文件路径等。
文件处理路径生成
def vfile_path(path_config):path = os.path.normpath(os.path.abspath(输出路径)) # 路径规范化print(f"输出路径: {path}")完整路径 = path + "\\" + 输出文件名try:Path( 完整路径).resolve()except OSError as e: #判断路径是否合法print(f"路径非法: {e.strerror}")dir = os.path.dirname(完整路径) #路径提取if not os.path.exists(dir):os.makedirs(parent_dir,mode=0o777, exist_ok=False) # 递归创建目录#print(f"创建父目录: {parent_dir}")return parent_dir
输出文件名拼接
info = [列表元素1,列表元素2,列表元素3,.....,列表元素n]
文件名="".join(info)
合成二进制文件
with open(合成的文件1, 'rb') as app,open(输出的文件名, 'wb') as image: #读取第一个文件的内容,打开app文件,使用'wb'代表以二进制覆盖的形式写入
os.path.isfile(合成的文件1) #判断文件是否存在
os.path.getsize(合成的文件1) #判断文件是大小
#若写入的文件较大,可以利用divmod(文件大小、分段大小)分段写入
for _ in range(分段):
image.write(app.read(分段大小)) #读取合成的文件1 写入输出的文件。
if 最后一段余大小 > 0:
image.write(app.read(最后一段余大小)) #读取合成的文件1 写入输出的文件。
fp_image.write(b"\xff" * (int(页大小,10) - 最后一段余大小)) #补充最后一页内容重复上述步骤with open(合成的文件2, 'rb') as app,open(输出的文件名, 'ab') as image: #读取第二个文件的内容,打开app文件,使用参数 "ab"代表以二进制追加的形式写入
写入具体内到二进制文件
通过zlib.crc32函数能够获取数据的CRC校验
endianness = sys.byteorder #通过返回值可以判断大小端 big大端 little小端
通过 struct.pack可以将数据打包位二进制数据流
with open(输出文件,'wb') as fp:fp.write(struct.pack打包的数据流)
若后续需要再写入其他数据这以'ab'增加的形式写入数据相关文章:
单片机 Bootloade与二进制文件的生成
单片机的 Bootloader 是一种特殊的程序,负责在单片机上电后初始化硬件、更新用户应用程序(固件),并将控制权移交给用户程序。以下是其运行机制和关键流程的详细说明: 1、单片机 Bootloader 的核心作用 固件更新&…...
MySQL数据库(3)—— 表操作
目录 一,创建表 1.1 创建表的SQL 1.2 演示 二,查看表 三,修改表 四,删除表 常用的表操作会涉及到两种SWL语句 DDL(Data Definition Language)数据定义语言:建表、改表、删表等࿰…...
Springboot + Ollama + IDEA + DeepSeek 搭建本地deepseek简单调用示例
1. 版本说明 springboot 版本 3.3.8 Java 版本 17 spring-ai 版本 1.0.0-M5 deepseek 模型 deepseek-r1:7b 需要注意一下Ollama的使用版本: 2. springboot项目搭建 可以集成在自己的项目里,也可以到 spring.io 生成一个项目 生成的话,如下…...
七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)
在棋牌游戏行业高速发展的今天,如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持,以及 乐豆系统、防沉迷、比赛场、AI智能…...
【深度学习在图像配准中的应用与挑战】
图像配准在深度学习中的解决方案越来越多,尤其是通过卷积神经网络(CNN)和生成对抗网络(GAN)等方法,可以显著提升图像配准的效果,尤其是在处理复杂的非刚性变换和大范围的图像差异时。 1. 基于深…...
HarmonyOS 开发套件 介绍 ——上篇
HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代,操作系统作为智能设备的核心,其重要性不言而喻。而HarmonyOS,作为华为推出的全新操作系统,正以其独特的魅力和强大的功能,吸引着越来越多的开发者和用户的…...
跳跃游戏(力扣55)
题目问是否可以跳到数组最后一个下标,有的同学可能会思考如何模拟跳跃这个操作,但这是比较困难的,很容易把自己绕进去。可以换一种思路,我们不需要知道具体是如何跳到最后一个下标的,而是找到最大的跳跃范围。如果该跳…...
网络空间安全(1)web应用程序的发展历程
前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷,从简单的文档共享系统到如今复杂、交互式、数据驱动的平台,经历了多个重要阶段。 一、起源与初期发展(1989-1995年) Web的诞生: 1989年,欧洲…...
机器学习 - 衡量模型的特性
最近我们陆续学习了机器学习的一些基础知识,本文来理解一下衡量机器学习模型的特性。了解机器学习模型的特性不仅有助于在理论上理解不同算法的工作原理,也能在实践中指导模型选择、参数调优、结果解释和系统部署,最终提高模型的实际应用效果…...
JUC并发—9.并发安全集合三
大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 1.并发安全的数组列表CopyOnWriteArrayList …...
Baklib云智协同:数字资产赋能企业效能跃升
内容概要 在数字化转型加速的背景下,Baklib通过构建智能化的知识中台架构,为企业打造了贯穿知识采集、整合、应用的全链路解决方案。该平台以动态知识图谱为核心技术底座,支持文档、音视频、代码等20余种格式的数字资产全生命周期管理&#…...
wordpress adrotate插件 文件上传漏洞
当你爆破进wordpress后台但权限不是管理员的时,如果你有adrotate插件操作权限可以用adrotate的文件上传功能get webshell 该漏洞需要AdRotate版本 < 5.13.3 第一步按顺序点击上传文件 在这里文件一定要压缩成zip格式,上传的时候也是上传这个zip 上…...
iframe 高さ 自動調整
iframeに異なるドメイン(クロスドメイン)のコンテンツを読み込んで高さを自動調節する方法 - みのるの備忘録 wordpress (親) 側の設定 <apex:iframe id"iframe" src"{!IF(isURL,Url, URLFOR($Resource.test))}" scrolling"…...
Apache Logic4j 库反序列化漏洞复现与深度剖析
前言 在渗透测试领域,反序列化漏洞一直是安全研究人员和攻击者关注的焦点。今天,我们将深入探讨 Apache Logic4j 库中的反序列化漏洞,详细了解其原理,并进行完整的复现演示。 一、漏洞原理 Apache Logic4j 库在处理对象的反序列…...
Python爬虫入门到精通:从零开始的数据采集之旅
一、网络世界的"小蜘蛛":什么是爬虫? 想象一下,你是一只勤劳的小蜘蛛,每天在互联网这张巨大的网上爬来爬去。你不需要自己织网,只需要顺着别人织好的网络路径,把有价值的信息收集到自己的小篮子里。这就是爬虫最形象的比喻——一个自动化的信息采集程序。 Py…...
《Operating System Concepts》阅读笔记:p50-p61
《Operating System Concepts》学习第 9 天,p50-p61 总结,总计 12 页。 一、技术总结 1.system call (1) 定义 The primary interface between processes and the operating system, providing a means to invoke services made available by the o…...
Transformer解析——(四)Decoder
本系列已完结,全部文章地址为: Transformer解析——(一)概述-CSDN博客 Transformer解析——(二)Attention注意力机制-CSDN博客 Transformer解析——(三)Encoder-CSDN博客 Transforme…...
Unity之Serialized序列化:从原理到实践
内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之Serialized序列化:从原理到实践 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心…...
毕业项目推荐:基于yolov8/yolov5/yolo11的番茄成熟度检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
Blaze RangePartitioning 算子Native实现全解析
引言:本文将全面且深入地解析Blaze RangePartitioning算子的Native实现过程。相较于原生Spark,RangePartitioning的Native实现在执行时间上达到了30%的显著下降,同时在资源开销方面节省了高达76%。这一改进大幅降低了运行成本,展现…...
么是静态住宅IP,跨境电商为什么需要静态住宅IP
静态住宅IP是指直接分配给一台属于私人住宅网络的设备的固定IP地址,这种地址不会频繁更改。它们作为代理IP,使使用者能够通过这些代理服务器进行网络访问,而对外显示的则是该住宅的IP地址。由于这些IP地址属于真实的住宅或个人,并…...
1、Window Android 13模拟器 将编译的映像文件导入Android Studio
1、环境准备 编译环境:Ubuntu-18.04.5编译版本:android13-release下载地址:清华大学开源软件镜像站AOSP # 下载repo # 同步代码:repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…...
MTK-Android13-包安装器PackageInstaller 静默安装实现
目的 我们最终是为了搞明白安装的整个流程。一方面通过安卓系统自带的包安装器来了解PMS 安装流程;另一方面熟悉框架层Framework 针对Android apk 安装流程。 前两篇文章分析了PackagerInstaller 安装流程。 Android13-包安装器PackageInstaller-之apk安装跳转 An…...
基于ffmpeg+openGL ES实现的视频编辑工具-opengl相关逻辑(五)
在我们的项目中,OpenGL ES 扮演着至关重要的角色,其主要功能是获取图像数据,经过一系列修饰后将处理结果展示到屏幕上,以此实现各种丰富多样的视觉效果。为了让大家更好地理解后续知识,本文将详细介绍 OpenGL 相关代码。需要注意的是,当前方案将对 OpenGL 的所有操作都集…...
QUdpSocket的readyRead信号只触发一次
问题 QUdpSocket的readyRead信号只触发一次。 原因 on_readyRead槽函数里必须读出现有数据后,才能触发新的事件。 解决办法 在on_readyRead槽函数里取出数据。 void MainWindow::on_readyRead() {qDebug() << "on_readyRead in";while (m_udp…...
【数据库系统概论】第第12章 并发控制
12.1 并发控制概述 并发控制是指数据库管理系统(DBMS)通过控制多个事务同时执行,保证数据的一致性和隔离性,避免事务间的相互干扰。 事务串行执行不能充分利用系统资源 并发执行的优点:能够减少处理机的空闲 时间&a…...
HTML应用指南:利用GET请求获取全国泸溪河门店位置信息
随着新零售业态的快速发展,门店位置信息的获取变得越来越重要。作为新兴烘焙品牌之一,泸溪河自2013年在南京创立以来,一直坚持“健康美味,香飘世界”的企业使命,以匠人精神打造新中式糕点。为了更好地理解和利用这些数据,本篇文章将深入探讨GET请求的实际应用,并展示如何…...
tg 2025 最新免费社工库机器人 已验证
最后验证时间:2025-01-17 AI社工库 t.me/AI_SGKBOT?s… X-ray社工库 t.me/Zonesgk_bot… 狗狗免费个户机器人 t.me/gougou88_bo… 免费个户机器人 t.me/SGKQMS_bot?… solo社工库 t.me/abababnbot?… 情报局社工库 t.me/qbjSGKxuanw… space社工库 …...
基于 JavaWeb 的 Spring Boot 调查问卷管理系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
Unity shader glsl着色器特效之 模拟海面海浪效果
一个简单的海浪效果,通过波的叠加实现水面起伏的动效,根据波峰斜率来为浪花着色,再根据法线贴图和水花贴图来和调整uv的平滑移动来增强海浪移动的细节。如果需要更逼真的效果可以考虑在满足浪花触发的地方添加粒子系统 前置效果图 因为是很久…...
