在调试PIC单片机在bootloader程序时,需要将hex文件转换为bin文件,在转换之前先了解一下hex文件中数据是如何定义的。
直接打开一个LED灯闪烁的程序生成的hex文件,芯片型号为PIC18F46K80
可以看到每条数据都是由6部分组成的,下面分别解释这6部分的含义。
第1部分,紫色数据,也就是冒号:
,这是数据的起始标志。
第2部分,棕黄色数据,1个字节,表示数据字节数,也就是后面黑色数据的字节个数。相当于要写入flash地址中的数据。
第3部分,蓝色数据,2个字节,表示数据的地址,地址范围就是从0x0000到0xFFFF,地址范围最大为64K。
第4部分,棕红色数据,1个字节,表示数据类型。
值有3中情况00,01,04。
00 表示后面的数据是需要给flash中写入的数据。如上图中第1行到第10行。
01 表示文件结束,如上图中13行所示。
04 表示后面的地址为扩展地址,因为数据地址只有2个字节,最大值只能表示到0xFFFF,如果地址超过0xFFFF,就需要用到扩展地址,表示将后面的地址值左移16位,如图中11行所示,后面的地址为0x0030,前面的数据为04,地址值就要左移16位,所以实际的地址值就是0x0300 0000。这个地址值刚好是配置位的地址值。所以上面第12行的数据其实就是写配置位。
第5部分,黑色数据,字节长度最大为16,表示要给flash中真正写入的数据。
第6部分,绿色数据,1个字节,表示从冒号后面到校验位前面所有数据的校验值。校验值的计算方法为,从冒号后面开始,所有的数据累加和再加上校验值,结果必须为256的整倍数。也就是说冒号后面所有的数据,去掉进位累加,结果要为0.比如全面所有的数据累加和为0xFE,那么校验值就必须为0x02,这样加起来的结果为0x100,最后两位值为0.
所以上面的hex文件表示的含义就是:
第1行写6个数据,写入的地址为0x2000,写入的数据值为 BA EF 7F F0 00 00 校验值为C2.
第2行写16个数据,写入的地址是0xFF74,写入的数据值为 00 01 BD EF 7F F0 0F 01 5C 6B 93 92 93 98 93 9A ,校验值为0D.
第3行到第10行都是这种方式写入数据。
第11行是将写入地址跳转到0x0300 0000处。
第12行是,再新跳转的地址处,也就是0x0300 0000处写入14个数据,其实就是代码中的配置字。
第12行代码文件结束。
一般情况下跳转到配置字地址的这行数据,都是固定的。比如这款单片机跳转到配置字的数据 每个hex文件 都是 ”020000040030CA“。
再打开一个EEPROM工程生成hex文件
可以看出第14行代码也是跳转到配置字的地址0x0030 0000 地址处。
那么第12行跳转到0x0020 0000 地址处是写什么数据的?可以直接再芯片手册中查找这个地址。
可以看到这个地址是用户ID的存储地址。第16行是跳转到地址0x00F0 0000地址处,这个地址在芯片手册上未找到相关资料,不过根据17行的数据可以看出,在这个地址上写入的值是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
此代码中在编译的时候直接给EEPROM中0–15地址中写入了数据0到15。
通过对hex文件有了深入了解之后,在编写调试bootloader代码时,就更容易了。