TIwilliam hill官网
直播中

汤赫禧

7年用户 219经验值
私信 关注
[问答]

C2000 F28027 Bootloader引导程序 串口烧录 程序跳转相关问题

工作平台28027+CCS5.5,想自己做Bootloader引导程序通过串口升级应用程序,这样就不用跳线;
FlashA区放Bootloader引导程序,FlashB/C/D区放应用程序;
用烧录器烧录时先烧录Bootloader引导程序至FlashA区(烧录时只擦除A区),仿真运行正常;
再用烧录器烧录应用程序至FlashB/C/D区(只擦除BCD区,由于还在调试阶段所以用仿真器烧录),每次烧录提示“Load Program Failed”,这个怎么解决?
另外,关于两个程序间跳转,不知跳转指令对不对,还需不需要其他处理?
从bootloader跳转至应用程序:
asm("    MOVL XAR7, #0x3F0000"); //0x3F0000是FlashBCD区的起始地址
asm("    LB *XAR7");

从应用程序跳转至bootloader:
asm("    MOVL XAR7, #0x3F6000"); //0x3F6000是FlashA区的起始地址
asm("    LB *XAR7");
多谢。

回帖(8)

郭楚

2018-11-30 15:19:18
你这个应该是bootloader和应用程序是两个不同的out文件,那么跳转的时候不能直接跳转到首地址。应该跳转到每个工程对应当_c_int00的地址,这个地址可以从map文件中找到。其他地址是跑不起来的。
举报

胡红枚

2018-11-30 15:25:52
引用: diowqdnc 发表于 2018-11-30 08:57
你这个应该是bootloader和应用程序是两个不同的out文件,那么跳转的时候不能直接跳转到首地址。应该跳转到每个工程对应当_c_int00的地址,这个地址可以从map文件中找到。其他地址是跑不起来的。

芯片上电厂商固话的 跳转应该是_c_int00吧
可以进行二次引导
举报

汤赫禧

2018-11-30 15:37:46
引用: diowqdnc 发表于 2018-11-30 08:57
你这个应该是bootloader和应用程序是两个不同的out文件,那么跳转的时候不能直接跳转到首地址。应该跳转到每个工程对应当_c_int00的地址,这个地址可以从map文件中找到。其他地址是跑不起来的。

多谢,按照你说的思路在map中找_c_int00地址,实际运行能正常跳转,是可行的,不过这样实现有点麻烦,源文件改动后_c_int00地址很可能也变了。
查找了下解决方法,由于_c_int00是从cmd文件BEGIN分配的地址跳转过来的,所以在跳转时直接跳转到BEGIN分配的地址去,实际运行OK,两个程序间能正常跳转了,这样的话跳转地址是分配好的,实现起来更方便些,不知这个实现方案有没有其他问题,因为没有在产品中应用过,不是很确定?
对于第一个问题也找到问题了,是由于之前两个程序的BEGIN地址空间分配的是一样的,导致烧录其中一个后,另一个就不能运行了,现在改为Bootloader分配自己的BEGIN地址空间,应用程序分配自己的BEGIN地址空间,两个程序间跳转也是根据这个地址跳转。
现在两个程序烧录后,每次最先运行的是Bootloader程序,这个先后顺序不知是确定的还是随机的,可不可以自己指定哪个程序最先运行?
1 举报
  • 王安兴: 你好,我按照你说的思路,做了两个工程,一个Bootloader工程(只擦除SECTOR A)和一个APP工程(只擦除SECTOR B/C/D),Bootloader工程的CMD codestart指向默认的BEGIN地址0x3F7FF6,APP工程的CMD codestart指向地址0x3F5FFC,然后分别将Bootloader和APP通过XDS100V2烧录到芯片以后,断电重启并没有从Bootloader跳转到APP中,使用的跳转指令是: #define JumpApp (void (*)(void))0x3F5FFC 在跳转的地方:(*JumpApp)(); 所以,想问一下能否分享下你的二次Boot开发方式?

汤赫禧

2018-11-30 15:46:45
引用: oiewjrj 发表于 2018-11-30 09:04
芯片上电厂商固话的 跳转应该是_c_int00吧
可以进行二次引导

mangui zhang:
多谢,不知你说的二次引导是如何实现的?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分