在使用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
}
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专家进行回复,并得到全球各地工程师的支持,分享他们的知识和经验。