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.

[参考译文] RM57L843:闪存擦除问题

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1216073/rm57l843-flash-erase-issue

器件型号:RM57L843

你(们)好。

我尝试使用 F021 API 擦除闪存、但在擦除检查期间失败了。  (已用:Fapi_issueAsyncCommandWithAddress (Fapi_EraseSector,(uint32_t *) u32EraseStart)

通过使用存储器浏览器检查擦除扇区的结果、位翻转被确认。  (0xFFFFFFFD、0xFFFFFFBF 等)

RM44和 RM46没有问题。

我在论坛上提到了一个类似案例的解决方案、但却发生了不启动等副作用。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1138207/faq-tms570lc4357-after-erasing-the-flash-contents-should-become-0xffffffff-why-the-flash-content-in-ccs-memory-browser-is-not-0xffffffff?keyMatch=TMS570LC4357:%20AFTER%20ERASING%20THE%20FLASH%20CONTENTS%20SHOULD%20BECOME%200XFFFFFFFF%20WHY%20THE%20FLASH%20CONTENT%20IN%20CCS%20MEMORY%20BROWSER%20IS%20NOT%200XFFFFFFFF

如何解决此问题?

我的 link.cmd 文件是:

/*--------------------------------------------------------------------------------------------------------------------------------------- */
/*内存映射*/
#define Vector_START_ADDR 0x00000000
#define FLASH_MAX_SIZE 0x00400000
#define Vector_SIZE 0x00000020
#define FLASH_API_SIZE 0x0000FFE0 /**/
#define FALSH_API_START_ADDR Vector_START_ADDR + Vector_SIZE
#define FLASH0_START_ADDR Vector_size + FLASH_API_SIZE
#define FLASH1_START_ADDR 0x00200000
#define FLASH0_SIZE FLASH1_START_ADDR -(vector_size + FLASH_API_SIZE)
#define FLASH1_SIZE FLASH_MAX_SIZE - FLASH1_START_ADDR

#define STACK_START_ADDR 0x08000000 /**/
#define STACK_SIZE 0x00006000 /* 4KB x 6 (SVC、IRQ、FIQ、SYS、ABT、 UNDEF、用户)*/
#define RAM_START_ADDR STACK_START_ADDR + STACK_SIZE /*/
#define RAM_SIZE (0x00080000 - STACK_SIZE)/* 512KB - STACK_SIZE */
#define EEPROM_START_ADDR 0xF0200000
#define EEPROM_SIZE 0x20000

内存
{
/*用户代码开始(2)*/
/*用户代码结束*/
向量(X):origin=vector_start_adDR length=vector_size
FLASH_API (RX):origin=FALSH_API_START_ADDR length=FLASH_API_SIZE
FLASH0 (RX):origin=FLASH0_start_adDR length=FLASH0_size vfill=0xFFFFFFFF
FLASH1 (RX):origin=FLASH1_START_ADDR length=FLASH1_SIZE
stacks (RW):origin=stack_start_adDR length=stack_size
RAM (RW):origin=RAM_START_ADDR length=RAM_SIZE

EEPROM (RW):origin=eeprom_start_adDR length=eeprom_size


/*编译错误  
ecc_vectors : origin=0xF0400000 length=0x000004 ecc={algoR5F021、input_range=vectors}
ECC_FLASH_API : origin=0xF0400004 length=0x001FFC ECC={ algoR5F021, input_range=flash_api }
ECC_FLASH0 : origin=0xF0402000 length=0x03e000 ECC={algoR5F021、input_range=FLASH0}
ECC_FLASH1 : origin=0xF0440000 length=0x040000 ECC={algoR5F021、input_range=FLASH1}
*/
/*用户代码开始(3)*/
/*用户代码结束*/

/*编译错误

ECC
{
algoR5F021:address_mask = 0x003FFFF8
汉明_MASK = R4
奇偶校验_MASK = 0x0c
镜像= F021

*/

/*
VECTORS (X):origin=0x00000000 length=0x00000020
FLASH0 (RX):origin=0x00000020 length=0x001FFFE0
FLASH1 (RX):origin=0x00200000 length=0x00200000
堆栈(RW):origin=0x08000000 length=0x00006000
RAM (RW):origin=0x08006000 length=0x0007a000
*/

/*用户代码开始(4)*/
/*用户代码结束*/


/*------------------ */
/*段配置*/

部分
{
excpt_vecs:start (ulFlashStartAddr){}palign=8 >向量

.intvecs :{}> vectors /* Vector table section */
.text:{}palign =8 > FLASH0 | FLASH1 /*程序代码*/
.const:{}palign =8 > FLASH0 | FLASH1 /*已初始化的常量对象(字符串常量、声明为常量的变量)*/
.cinit:{}palign =8 > FLASH0 | FLASH1 /*在启动时初始化 C 全局变量*/
.pinit :{} palign=8 > FLASH0 | FLASH1
.bss :{}> RAM /*未初始化的对象(全局变量)*/
.data :{}> RAM /*初始化的非常量对象(全局变量)*/
.sysmem:{}> RAM /*动态内存分配池*/

闪存 API:
{
..\Debug\package\hc\source\f021Control.obj (.text)
..\Debug\package\hc\source\sciControl.obj (.text)
..\Debug\package\hm\source\consoleManager.obj (.text)
--library =..\package\F021_LIB\F021_API_CortexR4_LE_L2FMC_V3D16.lib < FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.SetActiveBank.obj
FlashStateMachine.InitializeFlashBanks.obj
FlashStateMachine.EnableMainSectors.obj
FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.ScaleFclk.obj
FlashStateMachine.EnableEepromSectors.obj
init.obj
utilities.CalculateEcc.obj
utilities.WaitDelay.obj
utilities.CalculateFletcher.obj
Read.MarginByByByByByByBybe.obj
Read.Common.obj
Read.FlushPipele.obj
Read.WdService.obj
ASYNC.WithAddress.obj
program.obj >(.text)
}palign=8、load = flash_api、run = 0x8070000、load_start (API_load)、run_start (API_run)、 大小(API_SIZE)

/*用户代码开始(5)*/
/*用户代码结束*/


/*用户代码开始(6)*/
/*用户代码结束*/

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

祝你一切顺利。

基因。

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

    我试图通过参考类似的主题来解决我的问题,但我不能。

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601896/rm57l843-flash-bank-7-does-not-erase-correctly

    相反,还只出现了副作用。

    1.二进制文件太大。 (约1GB)  

    2.下载后,  确认它被初始化为0xFFFFFFFF。   我曾尝试使用 F021 API 擦除闪存、但在擦除检查期间失败了。 (0xFFFFFFFB)

    请帮我解决这个问题。

    此致。

    基因

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

    尊敬的 Jewook:

    我在 RM57器件上有一个示例 FAPI 项目

    e2e.ti.com/.../FAI_5F00_TEST_5F00_RM57.zip

    请完成随附的项目、如果它对解决您的问题没有帮助、我们将进行进一步调查。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Jagadish:

    感谢你的评分

    您的示例代码在我的板上运转良好。 它已经确认可在我的板上正常工作。

    我的问题是  、 在擦除完成后的擦除确认期间会发生故障。  

     

     闪存 R/W 期间存在其他问题。

    我的工作流程如所示。 (该器件的程序更新函数、并使用 F021 API - Fapi_issueProgrammingCommand、Fapi_issueAsyncCommandWithAddress)

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    1.要下载新程序、请从闪存组0 0x00060000 地址擦除0x40000  

    2.擦除后,在检查擦除过程中出现故障。 (为了通过测试、已阻止此代码)

    3、新程序下载到闪存组0 0x00060000地址。

    4.擦除旧程序区域(从0x00000000到0x00040000)  

    5.擦除后、 在检查擦除期间也会失败。 (为了通过测试、 已阻止 此代码)

    6、对于新的程序更新、从0x00060000复制到0x00000000 、复制大小为0x40000。

      此时、当复制的区域超过了 新程序的大小时、会发生异常。 (新程序大小为0x27000 -大小无关紧要)

      也就是说、当尝试复制0x27000的地址时会发生异常。   

      (为了进行测试、请使用 JTAG 人为地通过它)

    7.复制完成后 、要检查复制是否成功、可将 0x00000000和0x00060000之间的数据比较多达0x40000。

       此时  会发生异常。  (通过 CCS Memory 浏览器确认结果、确认实际值不同)

    --------------------------------------------------------------------------------------------------------------------------------------------------------

     备注: 具体而言,  当系统在发生第6号异常后重新引导时,将确认执行了"新程序"。

    就这么简单。

    我再次期待您的帮助。

    此致。

    基因

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

    尊敬的 Jewook:

    了解您的问题、请给我一些时间在结束时调试问题、我将尝试尽快提供更新。

    --
    谢谢与加油打气
    Jagadish。

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

    尊敬的 Jewook:

    我为基于链接器的 ECC 生成示例创建了一个示例工程。

    e2e.ti.com/.../RM57_5F00_Linker_5F00_ECC_5F00_Generation_5F00_TEST.zip

    在此项目中、我使用0xFF 值填充闪存和存储体7的未使用区域、也使用相应的值填充 ECC 区域。

    运行这个项目后、我验证并找到了所有未使用的闪存区域、其中0xFF 和存储体7也填充了 xFF。

    要正确运行该项目、请确保满足以下两项要求。

    1.确保按如下所示进行调试设置

    2.如果您使用的是最新的 CCS,请确保打开以下选项

    注意:我还没有检查 FAPI 例程。

    --

    谢谢。此致、
    Jagadish。

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

    亲爱的 jagadish。

    很抱歉迟到了回复。

    问题仍未解决。

    您的解决方案 只是额外发生的副作用。

    1.*。out 文件正常。 但 二进制大小(*。bin)太大。 (大约4GB)  

    2.下载后,  确认它被初始化为0xFFFFFFFF。   我曾尝试使用 F021 API 擦除闪存、但在擦除检查期间失败了。 (0xFFFFFFFB)  

    我期待您的再次帮助。

    此致。

    基因

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

    尊敬的 Jewook:

    感谢您提供详细信息、我将进行验证并提供更新。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1. *。out 文件正常。 但 二进制大小(*。bin)太大。 (大约4GB) [/报价]

    是的、二进制文件大约为4GB、这是因为包含了整个存储器范围(从0x00000000到0xF0480000 (ECC 空间))的内容。 不应使用链接器 ECC 生成二进制文件。 二进制文件通常用于可使用闪存 API 计算 ECC 的应用映像。

    2. 下载后、  经确认将其初始化为0xFFFFFFFF。   我曾尝试使用 F021 API 擦除闪存、但在擦除检查期间失败了。 (0xFFFFFFFB) [/报价]

    ECC 是否由链接器 cmd 脚本生成? 或由 CCS 触发?

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

    ECC 由 CCS 生成。  

    谢谢。此致、

    基因

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

    如果应用程序映像的 ECC 由 CCS 而不是链接器 cmd 脚本生成、则应用程序二进制文件的大小不应为4GB。

    您可以使用 bootloader 链接器 CMD 为整个闪存生成 ECC、可以使用 Bootloader 中的 F021闪存 API 生成应用映像的 ECC。