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.

[参考译文] CCS/RM48L952:F021闪存 API 不在同一组中运行、从而导致崩溃错误

Guru**** 2999690 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/922675/ccs-rm48l952-f021-flash-api-does-not-operate-in-the-same-bank-resulting-in-a-crash-error

器件型号:RM48L952

工具/软件: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 指示灯将亮起、无法恢复。

请帮助查看、问题出在哪里? 解决方案是什么? 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    你是对的。 对于闪存擦除和编程操作、闪存 API 必须从单独的闪存组或 SRAM 执行。  

    当您从引导加载程序对应用程序进行编程时、是否同时计算和编程了 ECC? 当您通过地址调用函数时、该地址是使用有效 ECC 进行编程、还是为空地址?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的回复。

    从引导加载程序对应用程序进行编程,我正在调用一个函数

    fapi_issueProgrammingCommand ((uint32_t *) dst、(uint8_t *) src、(uint32_t)字节、0、0、Fapi_AutoEccGeneration)

    Fapi_AutoEccGeneration,ECC 被自动计算。

    通过地址调用函数时、地址不是空地址、而是有效地址0x187900。 但是、该地址不应是 ECC 地址、而应是公共地址。

    我想知道我这么说是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    以下两幅图显示了仿真调试中发生 ECC 错误时的寄存器内容

    现在出现 ECC 实时锁定检测错误。 我不知道该错误是如何发生的?

    是否可以禁用 ECC?

    期待您的回复!!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅 TI 引导加载程序中的示例代码:bl_flash.c (已附)。 该文件具有使用 F021闪存 API 擦除/编程闪存的函数。

    如果在擦除操作后调用闪存空白检查、则应禁用 ECC 检查。 要禁用闪存 ECC 检查、请使用 sys_core.asm 中定义的函数: _coreDisableFlashEcc_()

    e2e.ti.com/.../bl_5F00_flash.c