hex 文件和 bin 文件剖析

news2025/1/3 4:35:01

目录

  • 一、概述
  • 二、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.coloradmin.cn/o/2179667.html

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

相关文章

《动手学深度学习》笔记2.5——神经网络从基础→使用GPU (CUDA-单卡-多卡-张量操作)

目录 0. 前言 原书正文 1. 计算设备 (CPU和GPU) 补充:torch版本cuda报错的解决方案 2. 张量与GPU 3. 存储在GPU上 4. 复制(多卡操作) 5. 旁注 (CPU和GPU之间挪数据) 6. 神经网络与GPU 小结 0. 前言 课程全部代码(pytorc…

Linux进程终止进程等待进程程序替换

目录 一、进程终止 1.1进程退出的场景 1.2进程常见的退出方法 ​1.3多进程的退出 ​1.4exit( )和_exit( ) 二、进程等待 2.1进程等待的必要性 2.2进程等待的方式 2.3获取子进程的statue 2.4非阻塞轮询 2.5进程等待的底层原理 三、进程程序替换 3.1单进程程序替换 …

踩坑Resilience4j @Bulkhead

先说问题情况 系统环境 java version: 17spring boot: 3.xspring cloud: 4.x 项目配置和代码 项目中使用了Spring Cloud Circuit Breaker <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbre…

Android 简单实现联系人列表+字母索引联动效果

效果如上图。 Main Ideas 左右两个列表左列表展示人员数据&#xff0c;含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表&#xff0c;点击某个item&#xff0c;展示一个气泡组件(它会自动延时关闭)&#xff0c; 左列表滚动并显示与点击的索引列表item …

Solidity智能合约调用其他合约的三种主要方式

在 Solidity 中&#xff0c;智能合约之间的交互非常重要。调用其他合约的功能可以增强合约的灵活性&#xff0c;使其能够执行跨合约操作&#xff0c;比如获取数据、转移资金或触发其他合约的功能。本文将详细介绍 Solidity 中调用其他合约的不同方式及其应用场景。 1. 合约间调…

【Unity踩坑】Unity更新Google Play结算库

一、问题描述&#xff1a; 在Google Play上提交了app bundle后&#xff0c;提示如下错误。 我使用的是Unity 2022.01.20f1&#xff0c;看来用的Play结算库版本是4.0 查了一下文档&#xff0c;Google Play结算库的维护周期是两年。现在需要更新到至少6.0。 二、更新过程 1. 下…

JAVA内存模型!=JVM内存模型

文章目录 前言JVM内存模型JAVA内存模型JAVA内存模型解释的问题可见性问题一致性问题 总结 前言 有很多JAVA开发人员&#xff0c;在被问起&#xff1a;“你知道Java内存模型吗&#xff1f;”&#xff0c;都会回答&#xff1a;“知道&#xff0c;JAVA内存模型分为方法区、堆、……

悟透自己、悟透生活、悟透人生(此文无价)

很多人都会有这样的疑问&#xff1a;“为什么听了很多道理&#xff0c;却依然没有过好这一生&#xff1f;” 古人给出了这样的回答。 王阳明曾说&#xff1a;“知行合一。” 老子则言&#xff1a;“知人者智&#xff0c;自知者明。” 可见&#xff0c;一切问题的根源都出在了我…

CSDN 的 GIt 是没东西吗

虽然说吧 CSDN 的博客也就那样&#xff0c;记得去年的时候 CSDN 出了一个 Git 代码库&#xff0c;被骂得要死&#xff0c;基本上是从外面搬了一堆代码回来。 这回 CSDN 又玩了个新东西&#xff0c;干脆你可以把你的博客文章同步到你在 CSDN 开的代码库上了。 如何同步 在 CS…

数据增强之imgaug的使用

包的导入 path = r"D:\\" # sometimes = lambda aug: iaa.Sometimes(0.5, aug) img = cv2.imread("D:\\photo\\test.jpg") img = cv2.resize(img,(128,128)) # img = cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY) cv2.imwrite(path+"img.jpg",img)随…

python并发编程实战

python并发编程有三种 多线程Thread多进程Process多协程Coroutine cpu密集型计算 cpu密集型也叫计算密集型&#xff0c;是指I/O在很短的时间就可以完成&#xff0c;cpu需要大量的计算处理&#xff0c;特点是cpu占用率相当高 例如&#xff1a;压缩解压缩、加密解密、正则表达…

【Qt】开发环境与下载

这里写目录标题 1 Qt的开发工具概述2 Qt的下载2.1 下载Qt SDK 3. 认识SDK中的重要工具 1 Qt的开发工具概述 Qt支持持多种开发工具&#xff0c;其中⽐较常⽤的开发工具有&#xff1a;Qt Creator、Visual Studio、Eclipse. (1) QtCreator Qt Creator 是⼀个轻量级的跨平台集成…

iot网关是什么?iot网关在工业领域的应用-天拓四方

一、IoT网关的定义 IoT网关&#xff0c;即物联网网关&#xff0c;是物联网&#xff08;IoT&#xff09;系统中的重要组成部分。它主要实现感知网络与通信网络&#xff0c;以及不同类型感知网络之间的协议转换&#xff0c;既能够支持广域互联&#xff0c;也能满足局域互联的需求…

windows系统下Telnet工具的安装步骤

通过控制面板启用Telnet客户端 点击“确定”按钮&#xff0c;按照系统提示完成安装。 打开cmd&#xff0c;输入telnet就可以了

APISIX 联动雷池 WAF 实现 Web 安全防护

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关&#xff0c;提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。 雷池是由长亭科技开发的 WAF 系统&#xff0c;提供对 HTTP 请求的安全请求&#xff0c;提供完整的 API 管理和…

【盘一盘】加密软件有哪些?10款电脑文件加密软件超好用推荐!让您的数据更安全!

在信息洪流中&#xff0c;数据安全如古战场上的坚固堡垒&#xff0c;至关重要。 古人云&#xff1a;"机密深藏&#xff0c;方能安身立命。" 为此&#xff0c;我特意搜罗了10款电脑文件加密软件&#xff0c;它们如同现代版的"八卦阵"&#xff0c;既能保护…

华为/海思 Hi3516CV610 4K@20,6M@30 分辨率,1T 算力 NPU

总体介绍 Hi3516CV610 是一颗应用在安防市场的 IPC SoC 。在开放操作系统、新一代视频编解码标准、 网络安全和隐私保护、人工智能方面引领行业发 展&#xff0c;主要面向室内外场景下的枪机、球机、半球 机、海螺机、枪球一体机、双目长短焦机等产品 形态&#xff0c;打…

Spring - @Import注解

文章目录 基本用法源码分析ConfigurationClassPostProcessorConfigurationClass SourceClassgetImportsprocessImports处理 ImportSelectorImportSelector 接口DeferredImportSelector 处理 ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar 接口 处理Configuratio…

全同态加密算法概览

我们前面有谈到《Paillier半同态加密算法》&#xff0c;半同态加密算法除了支持密文加法运算的 Paillier 算法&#xff0c;还有支持密文乘法计算的 RSA 算法&#xff0c;早期的PSI(隐私求交)和PIR(匿踪查询)都有使用基于RSA盲签名技术来实现。今天我们来谈谈能够有效支持任意函…

【Git原理与使用】分支管理

分支管理 1.理解分支2.创建分支2.1创建分支2.2切换分支2.3合并分支 3.删除分支4.合并冲突4.分支管理策略5.分支策略6.bug分支7.删除临时分支8.小结 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&…