大家好,我是电源漫谈,一般来说,程序编辑好之后,如果没有编译错误,那么由编译器编译后生成Hex文件,这个文件就可以被送到编程器中,从而对器件进行烧录编程。
图0 示例hex文件
从图0来看,hex就是一个16进制数文件,它具有一定格式,这里我们进行一些说明。
图1 hex典型格式
Hex文件的格式,如上述截图所示,共包含6个部分,开始冒号为起始记录,bb为字节个数,aaaa为地址,dd为具体的数据,cc为checksum部分。
图2 典型的hex示例解读
从上述示例中,我们可知,02代表这部分hex有两个字节,0400是这部分hex的存储地址,而00为其记录类型,后续我们会介绍一下记录类型有哪些种类,0034为数据部分,这里先存放低字节部分,后存放高字节部分。
图3 记录类型的说明
记录类型使用两位二进制数据表示,共有四种形式,如上表示,其中00表示数据类型,01表示文件结尾记录类型,后续我们对实际hex进行说明。
图4 hex文件结尾表示
这里是结尾hex数据表示,00代表有0个数据,地址表示0x0000,记录类型为0x01,checksum是0xFF.
图5 实际hex的文件
这里我们使用一个实际的PIC16F1778的代表编译出来的hex进行说明,第一行hex数据是02 0000 04 0000 FA,可以看出这里有两个hex字节,地址为0x0000,记录类型为扩展线性地址记录,数据是0000,checksum为0xFA,对应第一个PAGE存储空间。
第二行为04 0000 00 8031 0628 1D,这里显示为四个数据字节,地址为0x0000开始,类型为数据字节,具体数据为0x3180,0x2806,从program memory视图可以验证这个解读。
图6 hex解读1
第三行10 0008 00 8331 042B …0030 22,这里我们可知此处16个字节,从字节地址0x0008,换算成字地址后为0x0004开始,那么数据类型为00数据类型,后续就是具体的数据了,0x3183,0x2B04…等。
图7 hex解读2
图8 hex文件结尾处解读
最后一行00 0000 01 FF,这里可以看出它包含0个字节,地址为0x0000,记录类型为文件结尾0x01,checksum为0xFF.
倒数第二行04 000E 00 E43F FF3F 8D,这里表示四个字节,从0x000E字节地址开始,数据类型为00数据类型,具体数据为0x3FE4,0x3FFF,checksum为8D,如图10所示,这里对应的字起始地址为0x8007,具体数据为0x3FE4,0x3FFF,为芯片配置位部分。
图9 hex代码末尾解读
图10 配置位部分解读
倒数第四行为02 06B8 00 0800 38,此行代表hex末端最后两个字节,对应字地址为0x35C,具体数据为0x0008,由上述截图可知。
倒数第三行为02 0000 04 0001 F9,这里同样也是一个扩展线性地址记录类型,对应第二个PAGE空间。
图11 PIC16F1778/PIC16F1779的memory视图
从上述存储视图中,可以看到这个芯片存储空间由8个PAGE组成,每一个PAGE占用2048个字地址,对应4096个字节地址,也就是4kB,总共就是28kB空间。
图12 相同系列芯片FLASH空间说明
以上对这个系列芯片的hex文件格式进行了说明,作为进一步分析的基础。