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.

[参考译文] TMS570LS0714:闪存 ECC

Guru**** 2606725 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS0714

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/737327/tms570ls0714-flash-ecc

器件型号:TMS570LS0714
主题中讨论的其他器件:HALCOGEN

我正在使用 TMS570LS0714微控制器、并已在 Halcogen 中启用闪存 ECC。 ECC 生成已添加到链接器文件中。 我的应用是在闪存上加载自定义引导加载程序和具有 ECC 的应用固件。  

我遇到的问题是、当启用闪存 ECC (调用汇编函数 _coreEnableFlashEcc_();)时、会生成'flashErrorReal'错误。 我的问题是、只能将 BANK0的一部分设置为启用闪存 ECC 吗? 是什么导致触发 flashErrorReal 中止?

这是我的链接器文件:

存储器

向量(X) :origin=0x00000000

length=0x00000020

fill=0xffffffff

  BL_Magik (X) :origin=(end (vectors))(原点=(end (vectors)))

  length=0x00000040

  vfill=0xffffffff

  FLASH_API_LIB (RX):origin=(0x00040000)

  长度= 0x00000E10

  vfill=0xffffffff

  FLASH0 (RX):origin=(end (flash_api_LIB))

  length=(0x00040000 - size (flash_api_LIB))

  vfill=0xffffffff

 FLASH7 (RX):origin=0xF0200000

 长度=0x00010000

 vfill=0xffffffff

RAM    (RW):origin=0x08002000

长度= 0x0001E000

堆栈 (RW):origin=0x08000000

长度=0x00002000

/*闪存 ECC 部分*/

//组0 ECC

  ECC_VEC  (R) :origin=(0xf0400000 +(start (vectors)>> 3))

  length=(size (vectors)>> 3)

  ecc={算法=algoR4F021、input_range=vectors}

ECC_BL_Magik (R)origin=(0xf0400000 +(start (BL_Magik) >> 3))

length=(size (bl_Magik) >> 3)

ecc={算法=algoR4F021、input_range=bl_Magik}

ECC_FLASH_API (R) :origin=(0xf0400000 +(开始(FLASH_API_LIB) >> 3))

length=(size (flash_api_LIB) >> 3)

ecc={算法=algoR4F021、INPUT_RANGE=FLASH_API_LIB}

  ECC_FLASH0 (R) :origin=(0xf0400000 +(START (FLASH0) >> 3))

  length=(size (FLASH0) >> 3)

  ecc={算法=algoR4F021、INPUT_RANGE=FLASH0}

//组7 ECC

  ECC_FLA7 (R) :origin=0xF0100000

  length=(size (FLASH7) >> 3)

  ecc={algoR4F021、INPUT_RANGE=FLASH7}

/*闪存 ECC 部分*/

/*------------------ *

/*段配置                            *

部分

  .intvecs:{}>向量

  闪存 API:

  {

..\Debug\PeriphCode\Sources\Fapi_UserDefinedFunctions.obj (.text)

..\Debug\Code\FlashAPI.obj (.text)

--library= F021_API_CortexR4_be.lib < FlashStateMachine.IssueFsmCommand.obj

 FlashStateMachine.SetActiveBank.obj

 FlashStateMachine.InitializeFlashBanks.obj

 FlashStateMachine.EnableMainSections.obj

 FlashStateMachine.IssueFsmCommand.obj

 FlashStateMachine.ScaleFclk.obj

                   init.obj

                   utilities.CalculateEcc.obj

                   utilities.WaitDelay.obj

                   utilities.CalculateFletcher.obj

                   read.MarginByByByByByByByByByByByByByByBy

                   Read.Common.obj

                   read.FlushPipeline.obj

 read.wdService.obj

                   ASYNC.WithAddress.obj

                   program.obj >(.text)

  }load = flash_api_LIB、run = RAM、load_start (af_api_load)、run_start (af_api_run)、size (af_api_size)

axio_BL_Magik:{}> BL_Magik

.appl_start  :{}> BL_Magik

  .text  :{}> FLASH0

  .const  :{}>FLASH0

  .cinit  :{}> FLASH0

  .pinit  :{}> FLASH0

  stack:{}> stacks

  .bss   :{}> RAM

  .data  :{}> RAM

.sysmem :{}>RAM

fee_text_section:{}> FLASH0

  fee_const_section:{}> FLASH0

  fee_data_section:{}> RAM

/* ECC 配置                            *

ECC

  algoR4F021:address_mask = 0x003ff8 //地址位21:3 */

         汉明_MASK = R4      /*使用掩码中的 R4构建*/

         奇偶校验掩码 = 0x0c    //设置哪些 ECC 位是偶校验和奇校验*/

         镜像  = F021    /* RM4x 和 TMS570LSx 构建于 F021 */中

谢谢、

Gustavo Del Valle

MEMORY { VECTORS (X) :origin=0x00000000 length=0x00000020 fill=0xffffffff
  BL_Magik (X) :origin=(end(vectors)   length=0x00000040   vfill=0xffffffff
  FLASH_API_LIB (RX):origin=(0x00040000)   length=0x00000E10   vfill=0xffffffff
  FLASH0 (RX):origin=(end (flash_api_LIB))   length=(0x00040000 - size (flash_api_LIB))   vfill=0xffffffff
 FLASH7 (RX):origin=0xF0200000  length=0x00010000  vfill=0xffffffff
RAM    (RW):origin=0x08002000 length=0x0001E000
堆栈 (RW):origin=0x08000000 length=0x00002000
/*闪存 ECC 部分*/
//组0 ECC  ECC_VEC  (R) :origin=(0xf0400000 +(start (vectors)>>3) length=  (size (vectors)>>3)   ECC={ algoR4F021,input_range=vectors }
ecc_bl_Magik (R)origin=(0xf0400000 +(start (BL_Magik) >>3)) length=(size (BL_Magik) >>3) ecc={ algoR4F021,input_range=bl_Magik }
ecc_flash_API (R) :origin=(0xf0400000 +(start (flash_api_LIB )>> 3) length=(size (flash_api_LIB) >> 3) ecc={algoR4F021、input_range=flash_api_LIB}
  ecc_FLASH0 (R) :origin=(0xf0400000 +(start (FLASH0) >> 3))   length=(size (FLASH0) >> 3)   ecc={algoR4F021、input_range=FLASH0}
//组7 ECC  ECC_FLA7 (R) :origin=0xF0100000   length=(size (FLASH7) >> 3)   ecc={algoR4F021、INPUT_RANGE=FLASH7}
/*闪存 ECC 部分*/

/*------------------ //*段配置                            *
SECTIONS{  .intvecs:{}>向量
  flashAPI:  {..\Debug\periphCode\source\fapi_UserDefinedFuncations.obj (.text)..\Debug\Code\FlashAPI.obj (.text)
--library= F021_API_CortexR4_be.lib < FlashStateMachine.IssueFsmCommand.obj FlashStateMachine.SetActiveBank.obj FlashStateMachine.InitializeFlashBanks.obj FlashStateMachine.EnableMainSecectors.obj  FlashStateMachine.IssueFsmCommand.obj FlashStateMachine.ScaleFclk.obj                     init.obj                    utilities.CalculateEcc.obj                    utilities.WaitDelay.obj                    utilities.CalculateFletcher.obj                    read.MarginByByByByByByByByByByByByByByBy                    Read.Common.obj                    read.FlushPipeline.obj read.wdService.obj                    ASYNC.WithAddress.obj                    program.obj >(.text)
  }load = flash_api_LIB、run = RAM、load_start (af_api_load)、run_start (af_api_run)、size (af_api_size)
axio_BL_Magik:{}> BL_Magik .appl_start  :{}> BL_Magik
  .text  :{}> FLASH0  .const  :{}> FLASH0  .cinit  :{}> FLASH0  .pinit  :{}> FLASH0
  stack:{}> stacks  .bss   :{}> RAM  .data  :{}> RAM .sysmem :{}> RAM
fee_text_section:{}> FLASH0  fee_const_section:{}> FLASH0  fee_data_section:{}> RAM}
/* ECC 配置                            /ECC{  algoR4F021:address_mask = 0x003ff8 //地址位21:3 *          汉明_MASK = R4      /*使用掩码中的 R4构建*/          奇偶校验掩码 = 0x0c    //设置哪些 ECC 位是偶校验和奇校验*/          镜像  = F021    /* RM4x 和 TMS570LSx 构建于 F021 */}中

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

    "FlashECCReal"的错误是什么? ESM 寄存器中的哪个位被置位?
    您能否使用 TI CCS 生成 ECC 并对 ECC 进行编程?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    感谢您的回答!  

    设置为高电平的 ESM 寄存器位为 STAT3 (ESMSR3)、并设置为0x00000080。

    当使用 CCS 生成 ECC 时、我从链接器文件中删除了所有 ECC 配置、并在 CCS 中启用了"Auto ECC Generation"(自动 ECC 生成)(并删除了验证标志)。 加载后、我重启了设备电源、重新连接到 CCS 调试器、并设置了相同的 ESMSR3位。

    此致、

    Gustavo Del Valle

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

    您对我为什么会看到这种情况有什么想法吗? 我尝试过不同的方案、但它们都导致相同的失败。

    我们将感谢您的任何帮助。

    此致、

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

    当器件脱离器件复位序列时、闪存包装程序从组0的 TI OTP 部分读取两个配置字、即地址0xF0080140上的硬件配置字、然后读取地址0xF0000000上的 AJSM 可见密码。 在这些读取期间、ECC 被启用。

    纠正单位错误并生成一个 ESM 组1通道6错误事件。 第一个故障地址将与 FCOR_ERR_POS 寄存器中的位位置一起锁存在 FCOR_ERR_ADD 寄存器中、并且将更新 FEDACSTATUS 寄存器标志以指示错误类型。

    不可纠正的错误将生成一个 ESM 组3通道7错误事件、ERROR 引脚将被激活、第一个故障地址将被锁存在 FUNC_ERR_ADD 寄存器中、并且将更新 FEDACSTATUS 寄存器标志以指示错误类型。

    如果通过读取 OTP 和 AJSM 来出现您的案例中的错误、则您的代码应停留在 sys_startup.c 中的 for (;)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、  

    感谢您的回答。 运行调试器时、代码在 ESM 组3 (esmREG->SR1[2])下的'for(;)'停止、FUncErrAddr = 0x00000100且 FEDacStat = 0x00000100。

    这是不可纠正的错误、但我无法读取该地址的数据。 我不确定导致此不可纠正错误的原因是什么- 它是链接器文件吗?

    谢谢、

    Gustavo Del Valle

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

    让我们看看链接器 cmd 文件中的存储器设置:

    内存{
    向量(X) :origin=0x00000000 length=0x00000020 fill=0xffffffff
    BL_Magik (X) : origin=(end (vectors))(结束(向量)) length=0x00000040 vfill=0xffffffff
    FLASH_API_LIB (RX):origin=(0x00040000) 长度= 0x00000E10 vfill=0xffffffff
    FLASH0 (RX) :origin=(end (flash_api_LIB)) length=(0x00040000 - size (flash_api_LIB)) vfill=0xffffffff
    FLASH7 (RX) :origin=0xF0200000 length=0x00010000 vfill=0xffffffff
    RAM (RW) :origin=0x08002000 length=0x0001E000
    堆栈(RW) :origin=0x08000000 length=0x00002000


    在0x60到0x40000之间有一个大孔。 这个闪存区域的 ECC 值为0xFF (在被擦除后)、这不是0xFFFFFFFF 闪存内容的正确 ECC 值。 ECC 错误的地址也位于这个区域内。

    请在链接器 cmd 文件中计算此区域(0x60至0x40000)的 ECC。 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    感谢您的回答。 我已经更新了该区域的 ECC、但问题在于 F021闪存写入操作。 我还有另外一个问题:

    是否可以让引导加载程序启用闪存 ECC?如果可以、我是否要在固件和引导加载程序中设置链接器文件? 以下是我遇到的问题:

    答:由于需要在闪存的整个范围内计算 ECC、我想知道链接器是如何设置的、或者它们在固件端和引导加载程序端的外观如何。

    b.由于整个闪存需要具有 ECC、我生成的 bin 文件非常大。

    谢谢、

    Gustavo Del Valle

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

    我想知道您为什么使用链接器文件来生成 ECC?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我开始使用链接器来生成 ECC、因为我认为闪存中哪些区域可以具有 ECC 会有更多的控制。 使用 CCS 的自动 ECC 生成是否是更好的选择? ECC 是否仍会在整个闪存上计算?

    谢谢、

    Gustavo Del Valle

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

    您可以使用链接器 cmd 或 F021 API 为引导加载程序和应用程序(或固件)生成 ECC。 不能同时使用由链接器生成的 ECC 和由 F021 API 生成的 ECC。

    链接器命令文件指定了 ECC 的存储器范围。 您不必计算整个闪存。 例如、您可以使用链接器 cmd 文件为引导加载程序的前4个扇区生成 ECC、并为固件生成重映像扇区。