TI中文支持网
TI专业的中文技术问题搜集分享网站

F28377d的bootloader问题

你好,

我写了一个bootloader,使用CAN进行在线升级,bootloader放在A/B/C/D四个扇区,从E扇区(0x88000)开始放APP,flash读写使用TI提供的库。升级使用的bin文件是使用ccs的hex转换工具转换出来的

我的流程是: 1、上电后进入bootloader,在bootloader中时钟、串口(调试用)和can初始化完成后等待can数据升级指令

                      2、若can收到升级指令,初始化flash api,然后接收bin文件写入flash。写入完成后从flash读出进行一个简单的校验,若校验通过则跳转到APP

                      3、若5秒钟没有收到can升级指令,直接跳转至APP

            我的跳转函数

                  void run_app(void)

                {

                    void (*app)(void);

                    app = (void(*) (void) )(APP_ADDRESS);

                    app();

                }

我的问题是无法跳转到APP,执行完跳转函数后有两种情况:1、又进入到了bootloader(通过串口输出看到的),2、串 口没有任何消息(怀疑死在app中)

针对这个问题我做了一些测试:

1、使用ccs将固件烧写进去(不擦除bootloader),上电启动后进入bootloader中等待5秒钟,然后跳转可以跳转成功,证明跳转函数没问题?

2、由于转换工具转换hex到bin时将ff都写为了0,怀疑这个有影响,所以在bootloader中将通过ccs写入的固件读出,用串口发送给pc保存成bin文件,然后再通过can将这个文件升级到DSP的app位置,依然不能正确跳转

3、设置ccs,debug时只校验不擦写和写入,校验可以通过并且能够debug,说明我写入flash的固件是完全正确的。但是debug时会停在时钟初始化的一个状态等待中:sysctlclockset函数中  clkcfgregs.syspllctl1.bit.pllen =1;

                                                   while(clkcfgregs.syspllsts.bit.locks !=1){};

并且观察寄存器发现clkcfgregs.syspllctl1.bit.pllen并不是1.

另外APP的CMD文件中BEGIN设置为APP的起始地址0x88000,APP从E扇区0x88002开始存放

请问,我这个问题的是什么原因造成的?

user4115274:

回复 Eric Ma:

谢谢!

我的问题已经找到了,是由于APP里面,在initflash()函数中使能了ECC。只要关掉ECC就可以正常跳转,运行APP。而且我在写bootloader时也发现了这个ECC的问题,当我打开ECC时,我把我写入FLASH的数据再读出来时发现读出的数据不对,但是在CSS的memory browser窗口看对应地址的数据却是正确的,如果关掉ECC我读出的数据就会正确。请问这个问题在哪里?是不是我使用FLASH API的方法不对?

赞(0)
未经允许不得转载:TI中文支持网 » F28377d的bootloader问题
分享到: 更多 (0)