嵌入式学习之HEX转BIN文件
ztj100 2024-11-24 01:32 15 浏览 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文件的方案,希望大家多多参考。
好了,今天就和大家分享到这里,有什么想说的,一起来评论区聊聊吧!
相关推荐
- 30天学会Python编程:16. Python常用标准库使用教程
-
16.1collections模块16.1.1高级数据结构16.1.2示例...
- 强烈推荐!Python 这个宝藏库 re 正则匹配
-
Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
-
Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
-
实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
-
我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...
- 深入理解re模块:Python中的正则表达式神器解析
-
在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
-
需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...
- 先Mark后用!8分钟读懂 Python 性能优化
-
从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...
- Python“三步”即可爬取,毋庸置疑
-
声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
-
1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...
- Lavazza拉瓦萨再度牵手上海大师赛
-
阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...
- ArkUI-X构建Android平台AAR及使用
-
本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...
- Deepseek写歌详细教程(怎样用deepseek写歌功能)
-
以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...
- “AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测
-
“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...
- AI音乐制作神器揭秘!3款工具让你秒变高手
-
在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 30天学会Python编程:16. Python常用标准库使用教程
- 强烈推荐!Python 这个宝藏库 re 正则匹配
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
- 深入理解re模块:Python中的正则表达式神器解析
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
- 先Mark后用!8分钟读懂 Python 性能优化
- Python“三步”即可爬取,毋庸置疑
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
- 标签列表
-
- 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)