完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
|
|
你给我的工具生成的hex文件咋没指出这段程序是下载到哪个地址的。 终于看明白a00和a01原来一个是16位的高字节一个是16位的低字节,要把两个拼接起来才是一个完整的程序。 |
|
|
|
qwe050 发表于 2018-5-14 07:37 我给的那个.a00是用来SCI boot用的,SCI boot要有对应的格式。 你要用的hex文件是用来做什么的? Eric - ERIC |
|
|
|
我自己写了个bootloader,实现通过网络更新应用程序的功能。 |
|
|
|
那通过CCS的post build step就可以产生ASCII的hex文件。 CCS3.3生成HEX 1.找到CCS3.3的安装目录。在C2000目录找到一个叫hex2000.exe的可执行文件。我是在下面这个目录下找到的,供您参考。C:CCStudio_v3.3PLAC2000cgtoolsbin 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 - ERIC |
|
|
|
guigui_7044 发表于 2018-5-14 08:10 您好,请教您一个问题。我也想把.out转换成.hex文件,用做串口在线升级用。 您说的:“hex2000 -romwidth 16 -memwidth 16 -i -o xxx.hex xxx.out”,里面好像没有输入与.out文件对应的.map文件? 而且是不是还得通过 -e 输入指引导完成后,程序开始执行的入口地址? 还想请教一下就是关于hex文件的格式问题,比如ASCII格式,S-motorola格式等,这些不同的格式对在线升级有程序有什么影响? |
|
|
|
小三爷要吃肉 发表于 2018-5-14 08:29 xiansheng, 在命令行上增加一句 -map epwm_adc_soc.map 程序开始执行的入口地址?我认为不用。 你所需要的就是将.out文件转换成hex文件,hex文件即使对应flash地址要烧写的内容,只要把这些内容烧写进去就可以了。 至于ASCII格式或是Intel格式,这些里面都还有包含一些地址信息,或是其他符号,你需要通过上位机解析出来,哪个地址烧写什么数据,然后通过串口和芯片上的升级程序通信,将这些信息传送给芯片上的升级代码,升级代码调用flash API,烧写对应的地址。 所以上位机以及芯片上的升级代码配合起来就是CCS的烧写功能。 Eric - ERIC |
|
|
|
好的,谢谢您的指点,以后在做的过程中有问题再向您请教! |
|
|
|
qwe050 发表于 2018-5-14 07:37 楼主您好! a00和a01如果拼接啊?怎么下载,a00和a01里面都有校验和,如果处理啊? |
|
|
|
举个例,比如有两个数为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 >= 'A') && (str <= 'F')) [ n = str - 'A' + 10; ] else if ((str >= 'a') && (str <= 'f')) [ n = str - 'a' + 10; ] else if ((str >= '0') && (str <= '9')) [ n = str - '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。 |
|
|
|
qwe050 发表于 2018-5-14 09:17 嗯,知道了,我想问下您是自己写的bootloader程序还是dsp芯片内部本身自带的?呵呵,方便给个联系方式吗? |
|
|
|
我是自己写的bootloader,代码是公司的不方便透露给你 |
|
|
|
您误会了,我不是要代码的啊! |
|
|
|
peternie 发表于 2018-5-14 09:41 公司的产品在几年前就设计好了,那个时候没考虑升级的问题硬件上就没留串口。但是产品中使用了双口ram和上位机ARM平台通信而且有界面。 所以在不改动硬件的情况下只有自己写bootloader。我的思路也很简单,就是先规定出升级中用到的命令和数据格式,比如擦出扇区、编程、进入升级模式等。 在应用程序中收到进入升级模式的命令后在内存中设置一个标志就打开看门狗复位系统。复位后首先进入bootloader然后检查那个内存标志从而选择进入应用程序还是bootloader。如果进入bootloader则会接收数据、解析命令、校验数据的合法性然后再调用TI官方的API。 /* 命令头文件 */ #ifndef __COMMAND_H__ #define __COMMAND_H__ #ifndef WORD typedef unsigned short WORD; #endif #define PT_CMD (('M' << 8) | 'C') /* command packet type */ #define PT_DATA (('A' << 8) | 'D') /* data packet type */ #define PT_ACK (('C' << 8) | 'A') /* acknowledge packet type */ #define ACK_EOK 0 /* 成功 */ #define ACK_ECHK 1 /* 数据校验出错 */ #define ACK_EUNKNOWN 2 /* 无法识别的命令 */ #define ACK_ESIZE 3 /* 包大小错误 */ #define ACK_EBUSY 4 /* 需要等待 */ #define FLAG_DFORWORD 0xA000 /* 数据转发 */ /* 所有包的包头 */ struct pkt_hdr [ WORD usrdata; WORD type; WORD tsize; WORD chksum; ]; /* 命令包包头 */ struct cmd_hdr [ WORD usrdata;/* 用户自定义用途 */ WORD type; /* 固定值为'C''M'(command) */ WORD tsize; /* 命令包总大小(total size)以8位字节为单位 */ WORD chksum; /* 对整个包的校验和(包括参数) */ WORD id; /* 命令的ID号(发送方自定) */ WORD retry; /* 标示此命令是否是重试上一次的操作 */ WORD cmd; /* 命令码 */ ]; typedef struct cmd_hdr cmd_hdr_t; /* 数据包包头 */ struct data_hdr [ WORD usrdata;/* 用户自定义用途 */ WORD type; /* 固定值为'D''A'(data) */ WORD tsize; /* 整个包大小(8位字节单位) */ WORD chksum; /* 对整个包的校验和(包括数据) */ WORD addrL; /* 数据地址低16位(以8位字节为单位) */ WORD addrH; /* 数据地址高16位(以8位字节为单位) */ ]; /* 确认包包头 */ struct ack_hdr [ WORD usrdata;/* 用户自定义用途 */ WORD type; /* 固定值为'A''C'(acknowledge) */ WORD tsize; /* 整个包大小(8位字节单位) */ WORD chksum; /* 对整个包的校验和(包括数据,如果有) */ WORD id; /* 需要与命令包中的id相同 */ WORD status; /* 命令执行状态0为成功1为校验错误,其它值参见各命令 */ ]; typedef enum [ CMD_ALIVE = 0, /* 测试下位机是否处于激活状态 */ CMD_UPDATE = 1, /* 要求下位机进入升级模式 */ CMD_DOUT = 2, /* 将会有数据输出到下位机 */ CMD_DIN = 3, /* 从下位机获取数据 */ CMD_ERASE = 4, /* 擦除扇区 */ CMD_PROGRAM= 5, /* 扇区编程 */ CMD_VERIFY = 6, /* 数据确认 */ CMD_SEC_RSV= 7, /* 查询下位机的保留扇区 */ CMD_ENTRY = 8, /* 编程入口点的指令(0x3F7FF6处) */ ]cmd_t; #define ALIVE_REP_APP 0 /* 是应用程序在应答alive命令 */ #define ALIVE_REP_BTL 1 /* 是bootloader在应答alive命令 */ struct alive_reply [ struct ack_hdr head; WORD replier; ]; struct sec_rsv_reply [ struct ack_hdr head; WORD sectors; ]; /* 擦除扇区命令请求包 */ struct erase_request [ struct cmd_hdr head; WORD sectors; ]; /* 编程命令请求包 */ struct program_request [ struct cmd_hdr head; WORD p_addrL; /* 被编程地址的低16位 */ WORD p_addrH; /* 被编程地址的高16位 */ WORD immediately; /* 收到命令后立即用携带的数据编程 */ WORD s_addrL; /* 存储程序数据地址的低16位 */ WORD s_addrH; /* 存储程序数据地址的高16位 */ WORD size; /* 编程的数据大小 */ ]; /* 设置应用程序入口地址命令请求包 */ struct entry_request [ struct cmd_hdr head; WORD run; /* 设置入口地址后是否跳转到这个地址 */ WORD entry[2]; /* 入口点 */ ]; #endif |
|
|
|
qwe050 发表于 2018-5-14 09:55 您的思路是先通过通信,在ram中设置标志,之后通过看门狗复位。 装置再次启动,在您写的bootloader中程序中读到之前写的标志,之后进行通信接收数据,经校验无误后,调用Flash API进行擦,写,校验。 那么您的启动方式还应该是flash启动,而且你做的bootloader中应该有对串口程序的初始化,以及接收、发送函数吧? 而且烧写到单独一片flash中? 我现在也在做在线升级,不过我不打算在bootloader中做通信和擦、写、校验,我打算在复位看门狗之前做这些事情。 |
|
|
|
小三爷要吃肉 发表于 2018-5-14 10:12 xiansheng 您好! 我要做的基于CAN通信的,我想应该把它放到单独的一片flash中;我想问下您所说的不打算在bootloader中做通信和擦、写、校验,是什么意思啊? |
|
|
|
qwe050 发表于 2018-5-14 09:17 非常感谢楼主! 呵呵,那我先试着做做,中间再遇到问题了再请教您啦! |
|
|
|
peternie 发表于 2018-5-14 10:21 您好! 我打算在通信程序里完成在线升级功能,之后再通过看门狗复位。在接收到上位机发来的升级指令后,调用把数据写入一个空白的flash C区里,经校验无误后再通过flash API函数把数据接入flash A B D中。 擦,写,校验都是flash API的函数。 |
|
|
|
小三爷要吃肉 发表于 2018-5-14 10:44 本来就是要通过通信来完成升级的吧! |
|
|
|
只有小组成员才能发言,加入小组>>
422 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
285 浏览 1 评论
894 浏览 0 评论
TMS320F28377D:新做了以377d为芯片的板子,上电后芯片复位引脚出现方波请问如何解决?
2069 浏览 0 评论
TPS55340通电后输入端保险丝烧断,芯片输入和GND之间短路
3814 浏览 4 评论
CC3100BOOST使用CC3200lunchXL进行烧录
857浏览 2评论
94浏览 2评论
128浏览 2评论
106浏览 2评论
128浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-30 10:55 , Processed in 1.496925 second(s), Total 113, Slave 97 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191