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.

f021 flash api 不在同一个bank内操作,出现死机报错情况

在使用rm48系列处理器做升级时,需要用到flash api进行擦除读写等操作。

升级的整体流程是:程序启动时直接运行app,有通讯命令来时,跳转到boot程序中,将flash进行擦除,写入新的代码。

boot程序是单独的工程,将编译后的二进制代码以数组的形式放在app中,固定一些函数的地址,通过函数指针的方式从app中调用boot的函数,实现flash擦除读写等功能。

若将boot中flash的操作放在ram中执行,则代码编译时在ram中运行的部分在app中的二进制代码调用运行不正常,所以flash的操作没有在ram中,即将boot放在bank1中,将app放在bank0中,这样boot中的flash就可以对bank0中地址进行操作,具体地址分配如下:

bootloader的cmd文件:

MEMORY
{
    VECTORS    (X)   : origin=0x00180000 length=0x00000020
     FLASH0     (RX)  : origin=0x00180020 length=0x000fffff   
    SRAM       (RW)  : origin=0x08002000 length=0x0002D000
    STACK      (RW)  : origin=0x08000000 length=0x00002000
}
SECTIONS
{
   .intvecs : {} > VECTORS

   .text  > FLASH0
   .const > FLASH0
   .cinit > FLASH0
   .pinit > FLASH0
   .data  > SRAM
   .bss   > SRAM
}
app应用程序cmd文件:
MEMORY
{
    VECTORS (X)  : origin=0x00000000 length=0x00000020
    FLASH1  (RX) : origin=0x00000020 length=0x0017ffe0
    STACKS  (RW) : origin=0x08000000 length=0x00001500
    RAM     (RW) : origin=0x08001500 length=0x0003EB00
}
/*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */
SECTIONS
{
    .intvecs : {} > VECTORS
    .text    : {} >  FLASH1
    .const   : {} > FLASH1
    .cinit   : {} > FLASH1
    .pinit   : {} > FLASH1
    .bss     : {} > RAM
    .data    : {} > RAM
    .sysmem  : {} > RAM
}

但是调试的过程中发现,单独运行boot程序在bank1中,对指定的bank0地址进行flash的擦除读写操作全部正常,连续运行多次结果都正确。

但是通过前面介绍的方式,从app中通过函数指针的方式调用boot中的函数时,会出现连续调用几次就报错的情况,直接产生flash ecc错误,nerror指示灯点亮,不可恢复。

请大家帮忙看看,问题出在哪里?有什么解决方案,谢谢!