hex 文件和 bin 文件剖析

目录

  • 一、概述
  • 二、hex 文件
  • 三、bin 文件


在单片机开发中,hex 文件和 bin 文件是非常常见的两种烧写文件格式。比如在 Keil 中,编译好程序后,点击 Download 就可以把 hex 文件烧录到板子上。

而有时候在我们实现 IAP 时,有需要生成 bin 文件格式,再将其传输到单片机中,通过 Bootloader 将 bin 接收移到相应地址。

哪这两个文件有什么区别?为什么有时候用 bin,而有时候用 hex?本文将针对这两个文件进行讨论。

一、概述

二进制文件(Binary File)是一种以二进制形式存储的计算机文件,其中的数据以字节为单位进行编码。二进制文件可以包含任意类型的数据,如图像、音频、视频、可执行文件等。与之相对的是文本文件,文本文件使用字符编码(如 ASCII 或 Unicode)表示数据。

十六进制文件(Hex File)是一种特殊的二进制文件,其中的数据以十六进制表示。每个十六进制数对应 4 个二进制位,因此可以更直观地查看和编辑二进制数据。十六进制文件常用于存储和传输机器码(即可执行文件),特别是在处理嵌入式系统中常见的固件或软件升级时。

更具体地说,*.bin 文件是二进制文件,是纯粹的 Flash 映像,不含任何额外信息;而 *.hex 是 Intex Hex 格式的映像文件,可理解为带存储地址描述格式的 bin 文件。

在 Keil 中,可以通过如下方式来生成 bin 和 hex 文件:

要生成 hex 比较简单,选中这个选项即可:

要生成 bin 文件需要借助 fromelf 工具:


指令为:

fromelf --bin -o "$L@L.bin" "#L"// 或
fromelf --bin -o ./OBJECT/**.bin ./OBJECT/**.axf

注意,下面那种写法要写清楚自己的 bin 要放在哪个目录,以及 Keil 生成的 axf 所在的目录

二、hex 文件

hex 是 Intel 公司制定的一种使用 ASCII 文本记录机器码或常量数据的文件格式,这种文件常常用来记录将要存储到 ROM 中的数据,绝大多数下载器支持该格式。

一个 hex 文件由多条记录组成,而每条记录由五个部分组成,格式形如": ll aaaa tt [dd…] cc"

这里用不同的颜色和空格只是为了方便区分位

解释如下:

  1. ::每条记录的开头都使用冒号来表示一条记录的开始
  2. ll:以 16 进制数表示这条记录的主体数据区的长度(即后面 [dd…] 的长度)
  3. aaaa:表示这条记录中的内容应存放到 Flash 中的起始地址
  4. tt:表示这条记录的类型,它包含中的各种类型,类型见下表:
tt 的值代表的类型
00数据记录
01本文件结束记录
02扩展地址记录
04扩展线性地址记录(表示后面的记录按个这地址递增)
05表示一个线性地址记录的起始(只适用于 ARM)
  1. [dd…]:表示一个字节的数据,一条记录中可以有多个字节数据,ll 区表示了它有多少个字节的数据
  2. cc:表示本条记录的校验和(CheckSum),它是前面所有 16 进制数据(除冒号外,两个为一组)的和对 256 256 256 取模运算的结果的补码

例:下面以一个 hex 文件的前两行来分析:

:020000040800F2
:10000000E81B002091010008390B00088508000852// 下面分下段方便查看
:02 0000 04 0800 F2
:10 0000 00 E81B002091010008390B000885080008 52

首先看第一条记录:

  1. 02:表示这条记录数据区的长度为两字节
  2. 0000:表示这条记录要存储到 Flash 中地址为 0000 处
  3. 04:表示这是一条扩展线性地址记录
  4. 0800:由于这是一条扩展线性地址记录,所以这部分表示地址的高16位,与前面的"0000"结合在一起,表示要扩展的线性地址为"0x0800 0000",这正好是 STM32 内部 Flash 的首地址 (^人^)
  5. F2:表示校验和,它的值为 ( 0 x 02 + 0 x 00 + 0 x 00 + 0 x 04 + 0 x 08 + 0 x 00 ) % 256 (0x02+0x00+0x00+0x04+0x08+0x00)\%256 (0x02+0x00+0x00+0x04+0x08+0x00)%256 的值再取补码。

下面是第二条记录:

  1. 10:表示这条记录数据区的长度为十六字节
  2. 0000:表示这条记录要存储到 Flash 中地址为 0000 处
  3. 00:表示这是一条数据记录,数据区的是地址;
  4. E81B002091010008390B000885080008:要按地址存储的数据
  5. 52:校验和,计算方法同上

再往后看,第三、四行数据如下:

:10001000350B0008410200084913000800000000E9
:10002000000000000000000000000000B70E000803

可以看到,从第二行开始,它们的地址都只相隔了 0x10。Hex 文件内大部分都是这种格式。

最后两行如下:

:04000005080000ED02
:00000001FF// 分隔开
:04 0000 05 080000ED 02
:00 0000 01 FF

首先看倒数第二行,数据类型是 05,表示起始线性地址记录,其实它表示的是一个函数入口地址,但是这个函数地址并不会影响实际烧写到 Flash 中的内容,我们可以不管它,MDK 官方的解释是大多数情况下可以忽略它。

而倒数第一行,就纯粹表示文件结尾,没有别的含义,所有的 hex 文件的结尾都可以是这个。

我们在做有 IAP 功能的项目时,有时需要把 Bootloader 和 APP 两段代码合并以后烧写,这样可以大大简化操作步骤,此时,可以把两个 hex 文件手动合并。

操作方法是,把其中一个 hex 文件最后的两行(开始线性地址记录、文件结束记录),也就是刚才提到的那两行删除,再把另一个 hex 文件的所有内容都复制到其后就可以了。

当然,两个文件的地址区不应该有重叠

到这里,hex 的一些基本内容就介绍完了。

三、bin 文件

相比于 hex 文件,bin 文件就简单多了。bin 文件保存了需要烧写的目标文件内容,是没有任何附加格式的原始二进制文件。bin 文件其实就是 hex 文件中的数据部分:


结尾:

有关 bin 文件的一些信息,我在 STM32 芯片启动过程 一位中做过一些介绍

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter中token测试

案例: 网站:http://shop.duoceshi.com 讲解:用三个接口来讲解 第一个接口code:GET http://manage.duoceshi.com/auth/code 第二个登录接口:http://manage.duoceshi.com/auth/login 第三个接口:http://…

探索SpringBoot:学科竞赛管理项目开发

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,任…

fish-speech语音大模型本地部署

文章目录 fish-speech模型下载编译部署 小结 fish-speech模型 先说下fish-speech模型吧,可以先看下官网。如下: 这就是一个模型,可以根据一个样例声音,构建出自己需要的声音。其实,这个还是有很多用途的;…

产品管理- 互联网产品(5):运营知识与技能

了解运营 1、运营的基础是产品认清受众,切实解决问题、用户需求 2、运营活动贯穿产品的整个生命周期 3、找准用户,建立MVP 4、明确产品的应用场景。用户在何场景下基于何种需求使用产品?务必短流程 5、AARRR模型 6、运营管理流程类似产品管理…

API版本管理秒杀ApiFox的ApiFirst对比功能雏形演示

文章目录 前言第一版对比功能说明视频演示 前言 目前市面上主流的API管理工具在版本管理上,个人觉得做的比较粗糙,无法很直观的体现出版本之间差异,还停留在api元数据的文本比较上。用户更希望在浏览API文档阅读模式时能像word标注一样&…

Sqlserver 连接 chche 数据库详细步骤

zihao 第一步,安装ODBC驱动 在windows资源管理器里粘贴以下地址,会进入到驱动文件夹 ftp://ftp.intersystems.com/pub/cache/odbc/2018/ 第二步,添加ODBC 安装后,可能需要重启。然后打开控制面板,搜素ODBC&#xf…

The legacy JS API is deprecated and will be removed in Dart Sass 2.0

The legacy JS API is deprecated and will be removed in Dart Sass 2.0 更新了sass版本后,启动项目控制台一直在报错,影响开发效率,强迫症表示忍受不了。 字面意思是:Sass在2.0版本将会移除legacy JS API,所以现在使…

【ESP 保姆级教程】小课设篇 —— 案例:20231219_基于 ESP32 TFT显示课程表

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2024-09-30 ❤️❤️ 本篇更新记录 2023-09-30 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…

Linux命令一文速通速成

目录 嵌入式Linux的组成 Linux的介绍 Linux和发行版本 Linux应用 Linux特点 Linux发行版 GNU Linux目录结构 为什么要使用Linux命令? 登录 ​编辑 说明 shell是什么? bash shell Linux命令格式 命令格式举例 命令中的其他组成 Linux系统…

基于SpringBoot的诗词学习网站的设计与实现

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍:使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 (1)与指导老师确定系统主要功能; (2&am…

fastAPI教程:路由操作及HTTP请求响应

FastAPI 三、路由操作 3.1 路由装饰器 路由装饰器,也叫路径操作装饰器。 FastAPI提供了一系列基于HTTP请求作为方法名的装饰器给开发者用于绑定url地址提供给外界操作API接口。 HTTP方法FastAPI代码描述GETapp.get()async 方法名(): pass获取数据POSTapp.post(…

python15_转换为ASCII

转换为ASCII A A B 你好 C 66def str_to_ascii(s):# 如果输入是单个字符,直接返回其ASCII值if len(s) 1:return ord(s)# 否则返回每个字符的ASCII值列表return [ord(char) for char in s]def int_to_ascii(i):# 将整数转换为对应的ASCII字符return chr(i)if __…

光储一体化在停车场中的应用

近年来,光伏作为一种绿色环保无污染的可再生能源在中国的发展迅速。据统计,2022 全年光伏发电量为 4276 亿千瓦时,同比增长 30.8%,约占全国全年总发电量的 4.9%。然而,光伏发电也存在着不稳定性的问题,因此储能技术的发展成为克服…

AutoGen实现多代理-Tool_Use_and_Conversational_Chess(四)

1. 学习背景 如图,常见的Agent之间交流对话,可能会涉及到外部工具的调用和嵌套式聊天,这种设计模式就要求代理会使用工具和按序执行代码。本节尝试聊天机器人模拟人类进行下棋,如图所示,Chess Board代理则进行检测合…

【CSS Tricks】css动画详解

目录 引言一、动画关键帧序列二、动画各属性拆解1. animation-name2. animation-duration3. animation-delay3.1 设置delay为正值3.2 设置delay为负值 4. animation-direction5. animation-iteration-count6. animation-fill-mode7. animation-play-state8. animation-timing-f…

【大牛!】3DMAX城市交通插件CityTraffic使用方法详解

3dMax城市交通插件CityTraffic有助于在城市环境和越野环境中创建汽车交通流。特殊的道路编辑器和自动汽车设置大大加快了交通运动模拟场景的准备速度。 每辆车的配置多种多样,无论是悬架支架的调整还是驾驶风格,都能够创建逼真的模拟。动力学计算使复杂表面的运动更加真实,…

qt使用QDomDocument读写xml文件

在使用QDomDocument读写xml之前需要在工程文件添加: QT xml 1.生成xml文件 void createXml(QString xmlName) {QFile file(xmlName);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return false;QDomDocument doc;QDomProcessin…

损失函数篇 | YOLOv10 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU 最全汇总版

文章目录 更换方式CIoUDIoUEIoUGIoUSIoUWIoUFocal_CIoUFocal_DIoUFocal_EIoUFocal_GIoUFocal_SIoU提示更换方式 第一步:将ultralytics/ultralytics/utils/metrics.py文件中的bbox_iou替换为如下的代码:class WIoU_Scale: if monotonous = None , v1if monotonous = True , v…

通过台达ASDA-Soft伺服调试软件导入和导出伺服参数的具体方法示例

通过台达ASDA-Soft伺服调试软件导入和导出伺服参数的具体方法示例 首先,找一根通讯线,如下图所示,打印机通讯线就可以, 通信线连接台达伺服驱动器和电脑后,打开ASDA-Soft软件,如下图所示,勾选On-Line,然后点击开始自动侦测, 如下图所示,正常情况下,软件可以自动侦测…

国产长芯微LDC5541/LDC5542数模转换芯片DAC完全P2P替代AD5541/AD5542

LDC5541/LDC5542是单16位串行输入电压输出数模转换器(DAC),工作电压为2.7V至5.5V。DAC输出范围从0V延伸到VREF。DAC经过校准,在室温下提供16位的2LSB INL精度,在-40℃至85℃/105℃的整个指定温度范围内提供6LSB INL精度…