嵌入式学习之HEX转BIN文件
ztj100 2024-11-24 01:32 30 浏览 0 评论
发布了关于bootloader的文章之后,收到了很多讨论,今天笔者再和大家聊聊关于烧录文件的知识。由于机器只识别二进制文件,所以我们通过编译器如CCS,IAR,KEIL,MALAB等等将C语言或汇编语言编写的程序转换为HEX或BIN文件,然后下载到芯片中,这样芯片就能正常运转了。
HEX和BIN文件的区别
HEX文件:ASCII码文件,包含了升级文件的地址和校验信息;地址不连续;
BIN文件:十六进制文件,只包含升级数据文件;地址连续;
占用内存:HEX文件 > BIN文件;
升级时间:HEX文件 < BIN文件;(HEX文件升级时间不固定,跟着文件大小改变;BIN文件升级时间固定)
因为文件地址可以跳跃,理论上升级HEX文件比升级BIN文件耗时最短,效率更高;但是实际情况却恰恰相反。
由于HEX文件是ASCII码,所以需要上位机或主机把HEX文件转成机器可识别的二进制,再根据地址写进去;且实际应用发现,有些芯片跳跃地址写数据会失败,所以还是需要连续地址写入。因此需要上位机或主机需要将HEX文件转BIN文件,再通过连续地址将文件写入。
笔者推荐大家通过编译器直接生成BIN文件,不仅代码更精简,逻辑也更简单。
推荐大家看TI或ST的IAP程序,官方例程都是生成的BIN文件。
那么HEX文件如何转成BIN文件呢,接下来我们一起聊一聊。
HEX数据格式
:08007000760076130048C01B66 // 随机截取一段HEX文件
<0x3a> | :(冒号) |
[数据长度1byte] | 08(十六进制) |
[数据地址2byte] | 00 70(偏移地址) |
[数据类型1byte] | 00:数据 01:文件结束 04:基地址 |
[数据nByte] | 760076130048C01B |
[校验1Byte] | 66 |
<0x0d> | |
<0x0a> |
校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和
校验 = 0xff & (0x100 –(0x08+0x00+0x70+0x00+0x76+0x00+0x76+0x13+0x00+0x48+0xC0+0x1B)= 0x66
HEX文件解析要求
1、 需要区分基地址和偏移地址,地址为 基地址<<4+偏移地址
2、 中间跳跃的地址需要补0xff
3、 文件结束要注意,不能漏掉一两字节
hex转BIN文件步骤
读一行数据,校验此行的数据格式是否正确(冒号,校验和,换行符);
错误,提示“转换失败,第x行校验失败”。
正确,读取第4个字节,
值为0x01,表示文件结束,提示“文件转换完成”
值为0x04,更新基地址为 BaseAddress = data<<16
值为0x00,记录地址 Address = BaseAddress+data,数据长度len;数据data
hex转BIN文件举例
第一行::020000040008F2 ->基地址 0x0008
第二行::0400000000498BB078 ->数据 地址为 0x00080000,BIN文件为00498BB0
地址 = 0x00080000
BIN文件为 00498BB0;
预测地址 = 地址+长度/2 = 0x00080000+0x04/2 = 0x00080002
第三行::02000200AAAAA8 ->数据 地址为 0x00080002,数据为AAAA
地址=0x00080002=预测地址,不需要补数据
BIN文件为00 49 8B B0 AA AA
预测地址=0x00080002+0x02/2=0x00080003
第四行::200010008D007029762228C00068761A9A00D50028A403FFF7A496858F40040028A403FF9E->数据 地址为 0x00080010,数据为8D007029762228C00068761A9A00D50028A403FFF7A496858F40040028A403FF
地址=0x00080010>预测地址,BIN文件需要补FF,需要补个数=(地址-预测地址)*2=26,
BIN文件为00 49 8B B0 AA AA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 8D 00 70 29 76 22 28 C0 00 68 76 1A 9A 00 D5 00 28 A4 03 FF F7 A4 96 85 8F 40 04 00 28 A4 03 FF
预测地址=0x00080010+0x20/2 = 0x00080020
第五行::20002000F7A496858F40800028A40FFFF7A496858F40900028A40FFFF7A496858F40A000CD->数据 地址为 0x00080020,数据为F7A496858F40800028A40FFFF7A496858F40900028A40FFFF7A496858F40A000
地址=0x00080020=预测地址, 不需要补FF;
BIN文件为00 49 8B B0 AA AA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 8D 00 70 29 76 22 28 C0 00 68 76 1A 9A 00 D5 00 28 A4 03 FF F7 A4 96 85 8F 40 04 00 28 A4 03 FF F7 A4 96 85 8F 40 80 00 28 A4 0F FF F7 A4 96 85 8F 40 90 00 28 A4 0F FF F7 A4 96 85 8F 40 A0 00
预测地址=0x00080020+0x20/2=0x00080030
结语
以上就是对于HEX和BIN文件区别,以及HEX转BIN文件的方法,看起来还是比较简单的,就是工作量比较大,只要掌握了技巧还是不难。电脑由于内存大,运行速度快,所以没啥压力;如果通过MCU自己去解析就很慢也比较难受。
对于在线升级的应用环境,笔者还是希望大家多多使用BIN文件;TI和ST都提供了非常简单的生成BIN文件的方案,希望大家多多参考。
好了,今天就和大家分享到这里,有什么想说的,一起来评论区聊聊吧!
相关推荐
- sharding-jdbc实现`分库分表`与`读写分离`
-
一、前言本文将基于以下环境整合...
- 三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么
-
在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...
- MySQL8行级锁_mysql如何加行级锁
-
MySQL8行级锁版本:8.0.34基本概念...
- mysql使用小技巧_mysql使用入门
-
1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...
- MySQL/MariaDB中如何支持全部的Unicode?
-
永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...
- 聊聊 MySQL Server 可执行注释,你懂了吗?
-
前言MySQLServer当前支持如下3种注释风格:...
- MySQL系列-源码编译安装(v5.7.34)
-
一、系统环境要求...
- MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了
-
对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...
- MySQL字符问题_mysql中字符串的位置
-
中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...
- 深圳尚学堂:mysql基本sql语句大全(三)
-
数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...
- MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?
-
大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...
- 一文讲清怎么利用Python Django实现Excel数据表的导入导出功能
-
摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...
- 用DataX实现两个MySQL实例间的数据同步
-
DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...
- MySQL数据库知识_mysql数据库基础知识
-
MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...
- 如何为MySQL中的JSON字段设置索引
-
背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
【VueTorrent】一款吊炸天的qBittorrent主题,人人都可用
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)