近来写C8051 Boot代码,由于下载数据需要使用bin文件, 但是keil目前只能生成hex的格式,无奈之下上网找了半天,可没有方便的,无奈之下只能自己写一个了.
首先需要了解以下HEX的文件信息:
Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。Intel HEX文件经常被用
于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。
HEX格式文件以行为单位,每行由":"(0x3A)开始,以回车键结束(0x0D,0x0A)。行内的数据都是由两个字符表示一个16进制字节,比如"01"就表示数0x01;"0A"就
表示0x0A。对于16位的地址, 则高位在前低位在后, 比如地址0x010A,在HEX格式文件中就表示为字符串"010a". 下面为HEX文件中的一行:
:10000000FF0462FF051EFF0A93FF0572FF0A93FFBC
: 号表示一行的开始
: 后的第1, 2个字符表示本行包含的数据的长度,这里就是0x10即16个.
: 后的第3, 4, 5, 6个字符表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。
: 后的第7, 8个字符表示数据的类型
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
这里就是0x00即为普通数据记录。
自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。
最后两个字符表示校验码。
每个HEX格式的最后一行都是固定为:
:00000001FF
以上的信息其实就足够进行HEX转BIN格式的程序的编写。
我只处理数据类型为0x00及0x01的情况。0x02, 0x04表示对应的存储地址超过了64K,我没有用到.
这是生成的HEX文件
注意: 倒数第2行的
:031000001020308D
03 3个数据
1000 地址0x1000
00 数据记录
10 数据0x10
20 数据0x20
30 数据0x30
8D 校验和
:1000000012C02BC02AC029C028C027C026C025C0C6
:1000100037C023C022C021C020C01FC01EC01DC0C9
:100020001CC01BC01AC011241FBECFE5D4E0DEBF28
:10003000CDBF10E0A0E6B0E0E4E4F1E002C005903E
:100040000D92AE37B107D9F710E0AEE7B0E001C0CE
:100050001D92A038B107E1F762C0D2CF019782307C
:100060009105E4F70895CF93DF93EC01892B29F0F4
:1000700088EE93E0F3DF2197D9F7DF91CF910895D0
:100080001F920F920FB60F9211248F939F9380911E
:100090007E0090917F009DBD8CBD85B391E0892746
:1000A00085BB9F918F910F900FBE0F901F90189559
:1000B000CF93DF931FBC82E08EBD80E090E03AD00A
:1000C000282F882331F1C0E0D0E0E22FEF7089F0D3
:1000D00089B7846089BFE150FF27EE0FFF1FE05A08
:1000E000FF4F8081918190937F0080937E009DBD22
:1000F0008CBD22952F708AE8289FC0011124B3DFA0
:1001000089B78B7F89BF2196CE0114D0282F8823F1
:10011000E1F688EE93E0A7DFDF91CF910895CFE578
:10012000D4E0DEBFCDBF81E084BB8FEF85BB789488
:10013000BFDFFECFE199FECF9FBB8EBBE09A992730
:040140008DB30895DE
:1001440044FCACFC09FD34FD82FDC8FD06FE22FE24
:0E01540056FE85FE9AFEC1FEE4FE03FF11FF7B
:031000001020308D
:00000001FF