This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: CONTROLSUITE

现在我在做一个基于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的完整例程呢?

  • 自己回复一下,目前这个问题已经解决。

    开始是怀疑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,有几个问题想请教一下,可否加我QQ?我已经申请加您好友。

  • 很好的总结;

    Flash 编程完成的标志是不是就是Flash_Program()这个函数执行完成即可,即该语句运行完成?

    另外,API 在运行的时候要不断喂狗吧,要防止过程中DSP 被Reset 了?

  • 问个问题,楼主在IAP中更新的应该就是APP程序了,那么如何将APP程序单独分割开来进行编译更新呢?

  • 我已经成功实现在2812 以及28335 版本里面通过CAN 实现IAP,并成功跳转到APP,我的经验就是:
    在RAM 中运行IAP(擦除、编程、验证),当然Flash 参数要设置正确; 

    如果要Debug 问题,请按照这个参数去Debug:

    typedef struct {
    Uint32 FirstFailAddr;
    Uint16 ExpectedData;
    Uint16 ActualData;
    }FLASH_ST;

    同时通过Jtag 观察参数;

    你的问题是不是会进入Illegal ISR?

  • 这个问题我也遇到了,我用"pragma code_section"将iap程序分配到RAM,而且通过map文件也看到了,但在iap中擦除有代码的flash 块时进入Illegal ISR,请问是为什么?

    ps.我想先通过ram保存bin文件的所有内容,通过iap擦除整个flash,然后把新固件写回flash完成更新。

  • 我在10.15日问的问题意思是,每次我们编译获得一个bin文件,怎么区分其中的app部分和boot部分,毕竟已经是一堆二进制了,还是说按照cmd文件设置去寻找app的地址?

  • IAP, APP 其实就是一个整体,毕竟Flash 只有一块,为什么要区分呢?

    我在即将启动IAP 之前关闭中断,这时候就只有IAP 运行了;

  • 您好,我是从stm32过来的 ,后来接触到28335芯片要做CAN刷bootloader ,本来想直接移植stm32程序的,后来发现,CCS编译器操作比较繁琐,这方面的资料也少,目前还在研究。请问你能提供些你写的实现代码给我参考吗?能否给个联系方式,谢谢!
  • 我跟您碰到的问题是一样的,如果要擦除.text段的扇区,就会死机了。进入非法指令陷阱里面去了。

    请问您现在解决了吗?如何擦除这个扇区呢?

  • F021的api中有函数默认不在ram中,需要指定到ram中运行,否则擦除程序本身还在flash上就会出错
  • 将F021的api中函数指定到ram中,有具体方法,文档介绍吗?
    我现在就是在flash中操作,出现问题,程序跑飞。
  • 给个例子,让InitFlash函数运行到RAM:

     #pragma CODE_SECTION(InitFlash, "ramfuncs");

    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

    CMD文件中: 

       ramfuncs   : LOAD = FLASHD, 
                             RUN = RAML0, 
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             PAGE = 0