.hex文件格式,hex文件不能生成

  .hex文件格式,hex文件不能生成

  十六进制文件格式摘要

  什么是十六进制文件?

  十六进制是英特尔制定的文件格式标准。hex一般是一个文本文件,在微控制器的固件开发中经常可以看到。比如基于STM32F103用MDK进行硬件开发,软件可以生成十六进制文件;如下图所示;

  这是一个简单的STM32标准外设库项目,在代码中不做任何事情。如下所示:

  #include stm32f10x.h

  #包括

  //*

  * @ brief主程序。

  * @param None

  * @retval None

  */

  作废)。

  {

  /*在此添加您的应用程序代码

  */

  /*无限循环*/

  while(1).

  {

  }

  }

  最后打开生成的十六进制文件,发现确实是文本文件,所以只要写软件不能把十六进制文件转换成bmdgk文件再写,我就直接把十六进制文件写到单片机的Flash里。

  :0200000040800f2

  :10000000000400204901000890100010000000100000083 a

  :1000100097010008910100008810008810008810008810000001 b

  :10002000000000000000000000000000000000009d 010000000000000 a

  :10003000930100080000009 b 0100008290200084d

  :100040006301000863010008630100086301000800

  :1000500063010008630100008630100008630100008630100008630100008630100008630100008 f 0

  :100060063010008630100010001000863010000863010008630100086301000863010000808 e 0

  :10007000630100086301000863010000863010008630100086301000863010000008 d0

  :10008006301000863010001000100086300008630100008000002 c

  :10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

  :1000 a 0006301000863010000863010000863010000863010008630100086301000808 a 0

  :1000 b 0006301000863010000863010000863010000863010008630100086301000863010000890

  :1000 c 0006301000863010000863010000863010000863010008630100086301000800

  :1000d 0006301000863010000863010000863010000863010000863010000863010000870

  :1000 e 0006301000863010000863010000863010000863010000863010000860

  :1000 f 000630100086301000800080000000000028

  :100100000000000000000000630100086301000817

  :1001100063010008630100086301000086301000863010008630100086301000802 f

  :100120006301000863010000863010000863010000863010008630100086301000081 f

  :1001300063010008 dff 80 CD 000 f 018 f 80048004711

  :10014000 a 10200080004002006488047064800480048004800480048004800480044

  :10015000费7费7费7费7费7费7费7费7费7费777

  :10016000费72d 02000835010008064 c 074 DAA

  :1001700006 e0e 06840 f 0010394 e 807009847103477

  :10018000 AC 42 F6 D3 fff 7 daffa 4020008 b 40200087d

  :10019000费77047费770477047704770470000 d 4

  :1001 a 0000 CB 500211 f 4801910091026842 f 4803291

  :1001 b 0002604 ff4a 063026802 f 400320092019 ad 8

  :1001 c 000521 c 0192009 a 12 b 9019 a9 a42 f3d 1026824

  :1001d 000920324d 5012100914168416041684168416841604 a

  :1001 e 00041684160416821 f47 c 114160416841 f4fb

  :1001 f 00098114160016841 f 080710160016001688901d 6

  :10020000 fcd 5416821 f 003014160416841 f 0

  0201E1

  :1002100041604168 c1f 381010229 fad 10 CBD 00910 e

  :100220000 CBD 00000010024070470000104810 b5df

  :100230000016841 f 00101016041680 e4a 11404160 ce

  :1002400001680 D4 a 11400160016821 f 480210160 BC

  :10025000416821 F4 Fe 0141604 ff 41f 0181600021 db

  :10026000 c 162 fff 79 dff 05494 ff 00060086010 BDB 7

  :1002700000010024000000 fff 8 fffff 6 Fe 08 ed 00 e 06 e

  :10028000 fee 702 e 008 c 8121 f 08 c 1002 afad 1704731

  :100290007047002001 e001c 1121 f 002 afbd 1704706

  :1002 a 000 fee 70000 b 402000800000200004000087

  :0402B00092020008AE

  :0400000508000135B9

  :00000001FF

  存储形式

  从上面的文件中不难发现,hex文件的每一行都由:作为起始代码,这是显而易见的,而后面这些乱七八糟的数据又代表了什么?先看下图;

  类似于这种通用的通信协议,一帧数据往往包括起始码、数据长度、数据类型、数据、校验码等。所以十六进制文件也不例外。这里它包含了几个特性,下面指的是wiki;

  起始码:每一行数据作为一帧,用:作为起始码;

  长度:两位十六进制数(一对十六进制数),表示数据字段的字节数(一对十六进制数)。最大字节数为255(0xFF)。6 (0x10)和32(0x20)是常用字节;

  地址:四个十六进制数字,代表数据的16位起始内存地址偏移量。数据的物理地址通过将该偏移量与之前建立的基址相加来计算,因此允许存储器寻址超过16位地址的64 KB限制。默认情况下,基址为零,可以通过各种类型的记录进行更改。基址和地址偏移量始终表示为大端值。

  指令类型:两个十六进制数字00到05,定义该行数据的具体含义;

  数据:N字节数据序列,用2 N个十六进制数字表示;

  校验码:(两位十六进制数字),可以用来验证记录中没有错误的计算值;

  命令类型(记录类型)

  记录类型的值一般为00~05,以十六进制格式表示当前数据的含义:

  十六进制代码

  留档活字

  例子

  00

  数据

  包含数据和数据的16位起始地址。字节计数指定记录中的数据字节数。右边显示的例子是0B(十一)个数据字节(61、64、64、72、65、73、73、20、67、61、70)位于以地址开始的连续地址0010处。

  :0b 0010006164647265737320676170 a7

  01

  电渗流

  每个文件必须在文件的最后一行出现一次。数据字段为空(因此字节数为00),地址字段通常为0000。

  :00000001FF

  02

  扩展段地址

  数据字段包含一个16位段基址(因此字节数始终为02),并且与80x86实模式寻址兼容。地址字段(通常为0000)被忽略。最新的段地址02记录乘以16,然后加到每个后续的数据记录地址上,形成数据的物理起始地址。这允许寻址高达1 MB的地址空间。

  :020000021200个

  03

  起始段地址

  对于80x86处理器,请指定CS: IP寄存器的初始内容(即起始执行地址)。地址为0000,字节数始终为04,前两个数据字节为CS值,后两个为IP值。

  :0400000300003800C1

  04

  扩展线性地址

  允许32位寻址(最高4gb)。记录的地址字段将被忽略(通常为0000),其字节数始终为02。两个数据字节(big endian)为所有后续类型指定32位绝对地址的高16位00记录;这些高位地址位适用于下一个04记录。通过组合高16位的最新地址位来形成记录04,类型为00的绝对地址与低16位的地址记录00一起被记录。如果是00型记录,则之前没有04型记录,然后其高16位地址位默认为0000。

  :02000004FFFFFC

  05

  起始地址

  地址字段为0000(未使用),字节数始终为04。四个数据字节代表一个32位地址值(大端)。对于80386和以后的CPU,这个地址将被载入EIP寄存器。

  :0400000508000135B9

  校验和

  最后一个字节代表除起始码以外的其他字节的校验和,下面简单介绍一下它的计算方法,这里比较直观。

  对前面的十六进制做了一些简单的处理,以便以后分析:

  :02 0000 04 0800 F2

  :10 0000 00 00040020490100089901000895010008 3A

  :10 0010 00 9701000891010008810200080000000 1B

  :10 0020 00 00000000000000000000000009d 010008 2A

  :10 0030 00 9301000800000009 b 01000829020008 4D

  :10 0040 00 63010008630100086301000863010008 00

  :10 0050 00 63010008630100086301000863010008 F0

  :10 0060 00 63010008630100086301000863010008 E0

  :10 0070 00 63010008630100086301000863010008 D0

  :10 0080 00 63010008630100086301000800000000 2C

  :10 0090 00 000000000000000000000000063010008 F4

  :10 00a 0 00 63010008630100086301000863010008 A0

  :10 00 B0 00 6301000863010008630100086301000863010008 90

  :10 00c 0 00 6301000863010008630100086301000863010008 80

  :10 00d 0 00 6301000863010008630100086301000863010008 70

  :10 00 E0 00 6301000863010008630100086301000863010008 60

  :10 00f 0 00 63010008630100080000000000000000 28

  :10 0100 00 00000000000000006301000863010008 17

  :10 0110 00 63010008630100086301000863010008 2F

  :10 0120 00 6301000863010008630100086301000863010008 1F

  :10 0130 00 63010008 dff 80 CD 000 f 018 f 800480047 11

  字体10 0140 00 a 1020008000400200648804706480047 36

  :10 0150 00英尺七英尺七英尺七英尺七英尺七英尺七英尺七英尺7 7

  :10 0160 00 7费用72d 02000835010008064 c 074d AA

  :10 0170 00 06 E0 06840 f 0010394 e 8070098471034 77

  :10 0180 00 AC 42 f 6 D3 fff 7 daffa 4020008 b 4020008 7D

  字体D4

  :10 01a 0 00 0cb 500211 f 4801910091026842 f 48032 91

  :10 01b 00 00 02 604 ff4a 063026802 f 400320092019 a D8

  :10 01c 0 00 521 c 0192009 a12b 9019 a9 a42 F3 d 10268 24

  :10 01d 0 00 920324d 5012100914168416041684160 4A

  :10 01e 0 00 41684160416821 f47c 114160416841 F4 FB

  :10 01f 000 98114160016841 D6

  :E1

  :10 0210 00 41604168 C1 f 381010229 fad 10 CBD 0091 0E

  :10 0220 00 0 CBD 00000010024070470000104810 b5 DF

  :10 0230 00 016841 E4

  :公元前D4 a 1140016001680 f 480210160

  :10 0250 00 416821 F4

  :10 0260 00 c 162 fff 79 dff 05494 ff 00060086010 BD B7

  :10 0270 00 0010024000000 fff 8 fffff 6 Fe 08 ed 00 e 06 e

  :10 0280 00费702 e 008 c 8121 f 08 c 1002 afad 17047 31

  :10 0290 00 7047002001 e001c 1121 f 002 afbd 17047 06

  :10 02a 0 00费用70000 b4020008000002000040000 87

  :04 02B0 00 92020008 AE

  :04 0000 05 08000135 B9

  :00 0000 01 FF

  这里取最后三条指令,做一下检查;

  :04 02B0 00 92020008 AE

  :04 0000 05 08000135 B9

  :00 0000 01 FF

  :04 02B0 00 92020008 AE

  0x040x020xB00x920x020x08=0x152

  ~0x52 1=0xAE

  ~按位取反

  :04 0000 05 08000135 B9

  0x040x050x800x010x35=0X47

  ~0x47 1=0XB9

  ~按位取反

  :00 0000 01 FF

  ~0x01 1=0xFF

  ~按位取反

  十六进制转bmdgk文件

  资深调包侠找到一个可以使用的包;

  点安装英特尔公司

  根据示例,将foo.hex的内容转换为foo.bmdgk,地址从0转换为FF:

  $ python hex 2 BMD GK。py-r 0000:00FF foo。十六进制

  或(等效):

  $ python hex 2 BMD GK。py-r 0000:-s 256 foo。十六进制

.hex文件格式,hex文件不能生成