STM32 -Bin/Hex文件格式解析
文章目录
- 1. 概述
- 2. Hex文件
- 2.1 格式解析
- 2.2 数据类型
- 2.3 举例解析
- 2.4 合并两个Hex文件方法
- 3. Bin文件
- 3.1 生成方式
- 3.2 合并多个Bin文件方法
- 3.3 打开Bin文件方式
- 3.4 和Hex文件比较
- 4 总结
1. 概述
- Hex文件:它是单片机和嵌入式工程编译输出的一种常见的目标文件格式(比如keil就能编译输出hex文件),通过烧写工具把它下载到单片机中,程序就能在芯片中运行。
- Bin文件:keil就能编译输出Bin文件,当我们需要实现IAP远程升级芯片固件的时候,会通过Bootloader程序将Bin文件写到芯片的内部Flash里。
- 相关文档链接:
《用文本编辑器(记事本)合并两个Hex文件 - 详细操作步骤》
《Keil如何生成bin文件 - 附详细操作图文》
《J-Flash合并多个bin文件》
《Keil编译后生成bin文件占用内部Flash的大小,RAM,ROM,Code,RO-data,RW-data,ZI-data》
2. Hex文件

2.1 格式解析
- 每行以冒号(:)起始,后面每两个字母是一个8bit的16进制数;
- 每行的格式:BBAAAATTD……DCC:
- BB 表示本行数据的长度:
- AAAA 表示本行数据存储的地址;
- TT 表示数据类型;
- DD 是实际的数据,它的长度不定(每行以16字节对齐);
- CC 是校验和(计算方法:本行所有字节累加和(累加和只用低8位)取反再加1);
2.2 数据类型
-
数据类型一共有6种形式:
-
'00’数据记录(Hex文件的大部分记录都是数据记录);
-
'01’文件结束记录(标识Hex文件的结尾,放在文件的最后);
-
'02’扩展段地址记录;
-
'03’开始段地址记录;
-
'04’扩展线性地址记录(声明数据存储的高位地址);
-
'05’开始线性地址记录(线性起始地址指定__main(主程序前)函数的地址,通常可忽略);
-
2.3 举例解析
- 第一行 :020000040800F2
- 02 :表示本行数据的长度为2:
- 0000 :表示本行数据存储的地址;
- 04 :表示数据类型为扩展线性地址记录;
- 0800 :因为本行的数据类型为04,即0800声明了数据存储的高位地址为0x0800;
- F2 :校验和(计算方法:本行所有字节累加和(累加和只用低8位)取反再加1,即0xF2=0x01 + ∼(0x02+0x04+0x08))
- 第二行 :10300000E8740020493100085131000853310008AC
- 10 :表示本行数据的长度为16(可见数据存储以每行16字节对齐);
- 3000 :表示本行数据存储的地址低位为0x3000,即实际数据的存储地址为0x0800 3000;
- 00 :表示数据类型为数据记录;
- E…8 :因为本行的数据类型为00数据记录,DD区即为实际的数据;
- 第五行 :10FFF00004F086FA974890F82D000090954890F804
- 10 :表示本行数据的长度为16
- FFF0 :表示本行数据存储的地址低位为0x3010,即实际数据的存储地址为0x0800 FFF0;
- 第六行 :020000040801F1
- 02 :表示本行数据的长度为2:
- 0000 :表示本行数据存储的地址;
- 04 :表示数据类型为扩展线性地址记录;
- 0801 :声明了数据存储的高位地址为0x0801(当地址长度超过16bit 即0xFFFF时,就需要扩展线性地址记录再次声明新的高位地址);
- 倒数第三行 :0450900004012400F3
- 04 :表示本行数据的长度为4:
- 5090 :表示本行数据存储的地址低位为0x5090,即实际数据的存储地址为0x0801 5090;
- 00 :表示数据类型为数据记录;
- (此行长度不足0x10,只有0x04,这代表已经到了Hex文件数据的末尾了)
- 倒数第二行 :04000005080031318D
- 04 :表示本行数据的长度为4:
- 0000 :表示本行数据存储的地址;
- 05 :表示数据类型为开始线性地址记录;
- 此行内容通常可忽略,官方解释为:
- 线性起始地址指定__main(主程序前)函数的地址,但不指定启动代码的地址,启动代码通常在调用 SystemInit() 后调用__main。奇数线性起始地址表示 __main 是为 Thumb 指令集编译的。
- 线性起始地址记录可以出现在十六进制文件的任何地方。在大多数情况下,可以忽略该记录,因为它不包含闪存编程所需的信息。
- 倒数第一行 :00000001FF
- 00 :表示本行数据的长度为0:
- 0000 :表示本行数据存储的地址;
- 01 :表示文件结束记录(标识Hex文件的结尾,放在文件的最后);
2.4 合并两个Hex文件方法
- 当开发项目包含IAP升级芯片固件的功能时,需要把Bootloader和App两段代码的Hex文件合并以后再烧写,具体操作方法可参考以下内容:
- 《用文本编辑器(记事本)合并两个Hex文件 - 详细操作步骤》
3. Bin文件
3.1 生成方式
- 《Keil如何生成bin文件 - 附详细操作图文》
3.2 合并多个Bin文件方法
- 《J-Flash合并多个bin文件》
3.3 打开Bin文件方式
- 使用十六进制文件编辑器(我用的是:Uedit32.exe打开如下图所示:)

3.4 和Hex文件比较
- 对比上面打开的Hex文件里的内容,可发现Bin文件内容正好是Hex文件中数据段里的实际数据内容,没有数据长度、存储地址、校验等附加内容,Bin文件内容直接就是闪存内的代码文件,是没有任何附加格式的二进制原始文件
4 总结
授人以鱼,不如授人以渔
这里只提供钓鱼方法而不是一条完整的鱼
有问题欢迎留言交流 / 指正o( *  ̄▽ ̄ * )ブ
相关文章:
STM32 -Bin/Hex文件格式解析
文章目录 1. 概述2. Hex文件2.1 格式解析2.2 数据类型2.3 举例解析2.4 合并两个Hex文件方法 3. Bin文件3.1 生成方式3.2 合并多个Bin文件方法3.3 打开Bin文件方式3.4 和Hex文件比较 4 总结 1. 概述 Hex文件:它是单片机和嵌入式工程编译输出的一种常见的目标文件格式…...
【Java 进阶篇】Redis:打开缓存之门
介绍 Redis(Remote Dictionary Server)是一个高性能的键值对存储系统,被广泛用作缓存、消息中间件和数据库。它以其快速的读写能力、支持多种数据结构和丰富的功能而闻名。在这篇博客中,我们将深入了解Redis的概念、安装以及基本…...
Python与设计模式--享元模式
10-Python与设计模式–享元模式 一、网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行 线下配送。假设其咖啡对象构造如下: class Coffee:name price 0def __init__(self,name):se…...
亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(二)
向量数据库选择哪种近似搜索算法,选择合适的集群规模以及集群设置调优对于知识库的读写性能也十分关键,主要需要考虑以下几个方面: 向量数据库算法选择 在 OpenSearch 里,提供了两种 k-NN 的算法:HNSW (Hierarchical…...
怎么当代课老师教学生
老师朋友们,有没有帮忙当过代课老师呢?或者,没当过的老师是不是对这种职业充满了好奇?让我来分享一下,当代课老师的日常是什么样的吧! 备课 说起备课,那可是个大工程!不过ÿ…...
『 MySQL数据库 』表的增删查改(CRUD)之表的数据插入及基本查询
文章目录 📂 Create(创建/新增)📌全列插入与指定列插入📌📌单行数据插入与多行数据插入📌📌插入数据否则更新📌📌数据的替换📌 📂 Retrieve(查询)Ὄ…...
Vue中mvvm的作用
目录 模型表示应用程序的数据。在Vue.js中,它们是JavaScript对象。视图是用户界面。在Vue.js中,使用模板语法编写HTML的表示层。ViewModel是视图的抽象表示,负责处理用户输入的数据,并处理视图的数据绑定。ViewModel使用模型中的…...
基于springboot实现高校食堂移动预约点餐系统【项目源码】
基于springboot实现高校食堂移动预约点餐系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备…...
用element ui上传带参数的文件,并用flask接收
需求 网页需要实现上传一个csv文件,并携带两个表单的参数给后端 方法 上传组件 <el-uploadclass"upload-demo"dragaction"/upload" <!--要上传到的路由地址,跟flask路由函数对应-->accept".csv" <!--只接…...
[Android]使用Git将项目提交到GitHub
如果你的Mac还没有安装Git,你可以通过Homebrew来安装它: brew install git 方式一:终端管理 1.创建本地Git仓库 在项目的根目录下,打开终端(Terminal)并执行以下命令来初始化一个新的Git仓库࿱…...
python cv2.imread()和Image.open()的区别和联系
文章目录 1. cv2.imread()1.1 cv2.imread参数说明1.2 注意事项 2. Image.open()3. cv2.imread()与Image.open()相互转化3.1 cv2.imread()转成Image.open():Image.fromarray()3.2 Image.open()转成cv2.imread():np.array() 1. cv2.imread() cv2.imread()…...
hdlbits系列verilog解答(exams/m2014_q4i)-45
文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路: 二、verilog源码 module top_module (output out);assign out 1b0;endmodule三、仿真结果 转载请注明出处!...
flink源码分析之功能组件(二)-kubeclient
简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics,future。其中kubeclient上一个系列介绍过,为了系列完整性,这里“copy”一下。 kubeclient组件…...
无需API开发,有赞小程序集成广告推广系统,提升品牌曝光
无需API开发,实现有赞小程序与其他系统的连接 有赞小程序作为一个多功能的电子商务解决方案,为商家提供了无需复杂API开发就可以实现系统连接和集成的便捷途径。通过有赞小程序,商家可以轻松实现与各种系统的数据同步和应用互联,…...
CMD - ping
文章目录 前言参数 前言 ping 命令主要测试到达指定 IP 或主机的连通性. 参数 -t: ping 指定的计算机直到中断 -a: 将地址解析为主机名 -n count: 要发送的回显请求数...
数据结构与算法编程题23
设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树) #define _CRT_SECURE_NO_WARNINGS#inclu…...
小程序中的大道理之二--抽象与封装
继续扒 接着 上一篇 的叙述, 健壮性也有了, 现在是时候处理点实际的东西了, 但我们依然不会一步到底, 让我们来看看. 一而再地抽象(Abstraction Again) 让我们继续无视那些空格以及星号等细节, 我们看到什么呢? 我们只看到一整行的内容, 当传入 3 时就有 3 行, 传入 4 时就…...
基于卷积神经网络CNN开发构建HAR人类行为识别Human Activity Recognition【完整代码实践】
行为识别相关的开发实践在我们之前的博文中也有过相关的实践了,感兴趣的话可以自行移步阅读即可:《python实现基于TNDADATASET的人体行为识别》 《UCI行为识别——Activity recognition with healthy older people using a batteryless wearable sensor Data Set》《人体行为…...
excel自己记录
1、清除换行符号 2、添加特殊符号&并清除换行符号 7日&15日&30日&60日 3、判断单元格最后一个字符是不是数字,不是就删掉 IF(ISNUMBER(--RIGHT(B2,1)),B2,SUBSTITUTE(B2,RIGHT(B2,1),"")) ISNUMBER(--RIGHT(B2,1))判断最右边的一个数是否…...
vcsa6.7 5480无法登录
停电维护硬件后,发现vcsa异常,https://ip:5480无法登录,https://ip/ui正常,ssh登录页正常 kb资料 通过端口 5480 登录到 VMware vCenter Server Appliance Web 控制台失败 (2120477) 操作过程 Connecting to 192.16.20.31:22..…...
Pixel Aurora Engine实际应用:像素风APP图标+启动页+引导页一体化生成
Pixel Aurora Engine实际应用:像素风APP图标启动页引导页一体化生成 1. 像素极光引擎简介 Pixel Aurora Engine是一款基于AI扩散模型的高端绘图工作站,专为像素艺术创作而设计。它采用复古像素游戏风格的界面设计,通过简单的文字描述就能生…...
企业级云原生平台实战指南:Tsuru服务网格部署的完整解决方案
企业级云原生平台实战指南:Tsuru服务网格部署的完整解决方案 【免费下载链接】tsuru Open source and extensible Platform as a Service (PaaS). 项目地址: https://gitcode.com/gh_mirrors/ts/tsuru Tsuru是一款开源且可扩展的Platform as a Service (PaaS…...
别只盯着性能!从RapidJSON和cJSON的源码设计,聊聊C/C++ JSON库的‘优雅’与‘实用’
从RapidJSON与cJSON的源码哲学,解码C/C JSON库的设计艺术 在技术选型时,我们常常被性能指标和功能列表所吸引,却忽略了背后更为重要的设计哲学。RapidJSON和cJSON作为C/C领域最具代表性的两个JSON库,它们的差异远不止于性能数据表…...
q q q q q q q q q q q q q q q q q q q
q q q q q q q q q...
【Agent-阿程】AI先锋杯·14天征文挑战第14期-第13天-OpenClaw云记忆工作原理全拆解
【Agent-阿程】AI先锋杯14天征文挑战第14期-第13天-OpenClaw云记忆工作原理全拆解一、前言:读懂云记忆工作原理,玩转OpenClaw持久化记忆1.1 原理解读意义1.2 核心前提说明二、OpenClaw云记忆整体底层架构2.1 核心定位2.1.1 底层技术支撑2.1.2 整体架构总…...
从CPU型号到安全特性:如何用CPUID指令的01H参数探测Intel处理器的隐藏能力
从CPU型号到安全特性:如何用CPUID指令的01H参数探测Intel处理器的隐藏能力 在开发高性能安全工具或虚拟化监控系统时,了解处理器的底层特性往往成为决定成败的关键。想象一下这样的场景:当你需要检测系统是否遭受高级控制流劫持攻击ÿ…...
Vue Suspense 组件在 React 中,VuReact 会如何实现?
VuReact 是一个能将 Vue 3 代码编译为标准、可维护 React 代码的工具。今天就带大家直击核心:Vue 中内置的 <Suspense> 组件经过 VuReact 编译后会变成什么样的 React 代码? 前置约定 为避免示例代码冗余导致理解偏差,先明确两个小约…...
await FtpUploadFileAsync(orgTiffFilePath) 是否可以去掉 await
问题 1:await FtpUploadFileAsync(orgTiffFilePath) 是否可以去掉 await?回答是的,如果去掉 await,FtpUploadFileAsync 方法将以非阻塞的方式运行,调用它的代码会立即继续执行后续任务,而不会等待 FTP 上传…...
OmenSuperHub终极指南:三步掌控惠普游戏本性能与散热
OmenSuperHub终极指南:三步掌控惠普游戏本性能与散热 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普OMEN游戏本设…...
Z-Image-Turbo Web服务日志调试:从backend/main.py异常堆栈定位LoRA加载失败
Z-Image-Turbo Web服务日志调试:从backend/main.py异常堆栈定位LoRA加载失败 1. 问题背景与场景 最近在部署基于Z-Image-Turbo的图片生成Web服务时,遇到了一个棘手的问题:服务在启动时能够正常加载基础模型,但在尝试加载laonans…...
