工具/软件:Code Composer Studio
当使用 RM48系列处理器进行升级时、需要使用闪存 API 来擦除、读取和写入。
升级的总体过程是:程序启动时、它直接运行应用程序。 当发出通信命令时、它会跳转到引导程序、擦除闪存和写入新代码。
引导程序是一个单独的项目。 编译后的二进制代码以数组的形式放置在应用程序中、固定一些函数的地址、通过函数指针从应用程序调用引导函数、并实现闪存擦除、读取、写入和其他函数。
如果在 RAM 中执行引导中的闪存操作、则在代码编译期间在 RAM 中运行的应用程序中的二进制代码调用不会正常运行。 因此、闪存操作不在 RAM 中、也就是说、将 BOOT 放在 Bank1中、将 APP 放在 Bank0中、以便引导中的闪存可以在 Bank0中的地址上运行。 具体的地址分配如下:
引导加载程序的 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}应用程序 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}但是、在调试过程中、发现在 bank1中单独运行引导程序可以擦除指定的 bank0地址、读取和写入操作是正常的、并且在运行多次后结果是正确的。
但是、按照上述方式、从应用程序通过函数指针在引导中调用函数时、连续调用几次时会报告错误、这将直接导致闪存 ECC 错误、并且 nERROR 指示灯将亮起、无法恢复。
请帮助查看、问题出在哪里? 解决方案是什么? 谢谢!
