现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
robert liu:
自己回复一下,目前这个问题已经解决。
开始是怀疑CMD文件有问题,后来将APP的CMD文件放到例程,进行简单的修改后发现,例程也能进行擦除,所以排除了CMD的问题。
然后以例程为基础,将APP的内容增加到例程里面,最终没有出现擦除死机的情况了。
另外关于跳转的问题也不像之前想象的那么复杂:
目前的流程是:
->上电先运行APP
->接收到升级命令
->直接调用IAP程序(就像调用函数一样,只不过这个函数像多任务里面的另外一个任务一样,会进入一个while(1){}的死循环)
->IAP里面进行CAN收发处理,里面禁止中断,用查询的方法来进行CAN通信;接收CAN命令,根据命令进行擦除,编程。
->接收到退出IAP命令,退出IAP。
退出IAP的方法就是调用asm(" LB 0x3F7FF6"); 0x3F7FF6地址是厂家固化的Boot ROM退出之后的入口,他会自动将程引导到APP的main函数。
->这样 就实现了APP->IAP->APP的跳转了,
好了,时间关系暂时写到这,有空时完善下。
后面我还要增加人机界面,利用CAN通信,实现以下协议: "进入程序更新" ,"擦除", "通过USB加载程序", “编程” , “退出更需更新”,有问题继续在上面与大家交流。
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
叶子:
回复 robert liu:
学习了
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
Jianxu Yang:
回复 robert liu:
你好,我最近想做CAN IAP,有几个问题想请教一下,可否加我QQ?我已经申请加您好友。
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
Xiaohuang Li:
回复 robert liu:
很好的总结;
Flash 编程完成的标志是不是就是Flash_Program()这个函数执行完成即可,即该语句运行完成?
另外,API 在运行的时候要不断喂狗吧,要防止过程中DSP 被Reset 了?
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
user1260775:
回复 robert liu:
问个问题,楼主在IAP中更新的应该就是APP程序了,那么如何将APP程序单独分割开来进行编译更新呢?
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
Xiaohuang Li:
回复 user1260775:
我已经成功实现在2812 以及28335 版本里面通过CAN 实现IAP,并成功跳转到APP,我的经验就是:在RAM 中运行IAP(擦除、编程、验证),当然Flash 参数要设置正确;
如果要Debug 问题,请按照这个参数去Debug:
typedef struct { Uint32 FirstFailAddr; Uint16 ExpectedData; Uint16 ActualData;}FLASH_ST;
同时通过Jtag 观察参数;
你的问题是不是会进入Illegal ISR?
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
user1260775:
回复 Xiaohuang Li:
这个问题我也遇到了,我用"pragma code_section"将iap程序分配到RAM,而且通过map文件也看到了,但在iap中擦除有代码的flash 块时进入Illegal ISR,请问是为什么?
ps.我想先通过ram保存bin文件的所有内容,通过iap擦除整个flash,然后把新固件写回flash完成更新。
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
user1260775:
回复 Xiaohuang Li:
我在10.15日问的问题意思是,每次我们编译获得一个bin文件,怎么区分其中的app部分和boot部分,毕竟已经是一堆二进制了,还是说按照cmd文件设置去寻找app的地址?
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
Xiaohuang Li:
回复 user1260775:
IAP, APP 其实就是一个整体,毕竟Flash 只有一块,为什么要区分呢?
我在即将启动IAP 之前关闭中断,这时候就只有IAP 运行了;
现在我在做一个基于CAN的IAP,controlsuite里面有一个Flash API的例程序(Example_Flash2803x_API),讲述了如何利用Flash API函数来擦除与改写片上Flash.
我利用这个例子编译后调试是可以擦除与改写Fash的,但是我将这部分代码放到我的APP里面一起整合,代码变化不大。
我把我的APP程序的main去掉,例程与APP的其他代码一起参与编译,同时IAP代码放到FlashA扇区,APP代码放到其他Flash扇区,然后运行IAP里面擦除和编程功能,单步跟踪到擦除APP部分扇区时总是出现死机,具体就是
Status = Flash_Erase(SECTORF,&FlashStatus),这一句总是跳不过去,确定SECTORF不是IAP所在的扇区
我用的芯片是28035.
我想可能与cmd文件有关,但是我花了几天去修改这部分还是有同样的问题,如果与APP代码整合,CMD文件有这么重要吗,需要注意哪些问题
单独运行例程是对的。
请帮我分析下可能的原因,谢谢!
另外看到网上有很多关于IAP与APP的疑问,为什么到现在也看不到关于IAP与APP的完整例程呢?
sun Jack:您好,我是从stm32过来的 ,后来接触到28335芯片要做CAN刷bootloader ,本来想直接移植stm32程序的,后来发现,CCS编译器操作比较繁琐,这方面的资料也少,目前还在研究。请问你能提供些你写的实现代码给我参考吗?能否给个联系方式,谢谢!