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

关于利用Flash_API的接口函数擦除代码的问题

现在我在做一个基于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编译器操作比较繁琐,这方面的资料也少,目前还在研究。请问你能提供些你写的实现代码给我参考吗?能否给个联系方式,谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » 关于利用Flash_API的接口函数擦除代码的问题
分享到: 更多 (0)