我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
he yuanjie:
回复 Eric Ma:
你给我的工具生成的hex文件咋没指出这段程序是下载到哪个地址的。
终于看明白a00和a01原来一个是16位的高字节一个是16位的低字节,要把两个拼接起来才是一个完整的程序。
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
Eric Ma:
回复 he yuanjie:
我给的那个.a00是用来SCI boot用的,SCI boot要有对应的格式。
你要用的hex文件是用来做什么的?
Eric
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
he yuanjie:
回复 Eric Ma:
我自己写了个bootloader,实现通过网络更新应用程序的功能。
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
Eric Ma:
回复 he yuanjie:
那通过CCS的post build step就可以产生ASCII的hex文件。
CCS3.3生成HEX
1.找到CCS3.3的安装目录。在C2000目录找到一个叫hex2000.exe的可执行文件。我是在下面这个目录下找到的,供您参考。C:\CCStudio_v3.3PLA\C2000\cgtools\bin 2.把要转的xxx.out文件拷到这个目录下。 3.在电脑上进入 start->run->cmd进入命令行窗口。用DOS命令进入hex2000.exe的安装目录。 hex2000 -romwidth 16 -memwidth 16 -i -o xxx.hex xxx.out就会在当前目录下生成一个叫xxx.hex的文件。
CCSv5生成HEX
1.在IDE中选择 菜单 project->propertise打开下面界面。 2.在左侧选中CCS Build 在右侧的选项卡中点击Steps 3.在最下方Apply Predefined Step选中 Create flash image: Intel-HEX 4.在编译的时候会自动生成一个xxx.hex文件。
如果要改成ASCII的hex文件,只要修改上面的命令行-i 改成-a
Eric
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
xiansheng qian:
回复 Eric Ma:
您好,请教您一个问题。我也想把.out转换成.hex文件,用做串口在线升级用。
您说的:“hex2000 -romwidth 16 -memwidth 16 -i -o xxx.hex xxx.out”,里面好像没有输入与.out文件对应的.map文件?
而且是不是还得通过 -e 输入指引导完成后,程序开始执行的入口地址?
还想请教一下就是关于hex文件的格式问题,比如ASCII格式,S-motorola格式等,这些不同的格式对在线升级有程序有什么影响?
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
Eric Ma:
回复 xiansheng qian:
xiansheng,
在命令行上增加一句 -map epwm_adc_soc.map
程序开始执行的入口地址?我认为不用。
你所需要的就是将.out文件转换成hex文件,hex文件即使对应flash地址要烧写的内容,只要把这些内容烧写进去就可以了。
至于ASCII格式或是Intel格式,这些里面都还有包含一些地址信息,或是其他符号,你需要通过上位机解析出来,哪个地址烧写什么数据,然后通过串口和芯片上的升级程序通信,将这些信息传送给芯片上的升级代码,升级代码调用flash API,烧写对应的地址。
所以上位机以及芯片上的升级代码配合起来就是CCS的烧写功能。
Eric
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
xiansheng qian:
回复 Eric Ma:
好的,谢谢您的指点,以后在做的过程中有问题再向您请教!
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
nvshi li:
回复 he yuanjie:
楼主您好!
a00和a01如果拼接啊?怎么下载,a00和a01里面都有校验和,如果处理啊?
我执行 hex2000 -map *.map -a *.out后生成了两个hex文件,一个叫*.a00一个叫*.a01我到底该用哪一个呢。
he yuanjie:
回复 nvshi li:
举个例,比如有两个数为0x1122、0x3344那么a00文件中存的是22 44,a01文件中存的是 11 33。你把这些字符转化为数字,a01的左移8位和a00的相与就可以了。
/* 十六进制字符串转换为整数 */static unsigned long htoi(char *str, unsigned *end){ int i, n = 0; unsigned long tmp = 0;
for (i = 0; i < 8; i ++) { if ((str[i] >= 'A') && (str[i] <= 'F')) { n = str[i] – 'A' + 10; } else if ((str[i] >= 'a') && (str[i] <= 'f')) { n = str[i] – 'a' + 10; } else if ((str[i] >= '0') && (str[i] <= '9')) { n = str[i] – '0'; } else { break; }
tmp = tmp * 16 + n; }
if (end != NULL) *end = i + 1;
return tmp;}
这是转换程序,end会指出在遇到第几个字符转化结束。比如 char *str = "A2 3D 4C"那么转换结果为162,遇到A2后面的空格结束*end = 3。