你好,
我写了一个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的方法不对?