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

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指示灯点亮,不可恢复。

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

Annie Liu:

感谢您对TI产品的关注!为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上https://e2e.ti.com/support/microcontrollers/hercules/f/312,将由资深的工程师为您提供帮助。我们的E2E英文社区有TI专家进行回复,并得到全球各地工程师的支持,分享他们的知识和经验。

赞(0)
未经允许不得转载:TI中文支持网 » f021 flash api 不在同一个bank内操作,出现死机报错情况
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1