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.

[参考译文] TMS570LS3137:BANK0扇区擦除问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/803543/tms570ls3137-bank0-sector-erase-problem

器件型号:TMS570LS3137

您好,  

此查询包含引导加载程序和 F021_API_CortexR4_be_V3D16.lib 的用法 ,如何 在 RAM 中动态加载 F021_API_CortexR4_be_V3D16.lib,并且在加电序列期间不执行。

擦除闪存 组1的扇区15至27时没有错误。

引导加载程序位于闪存 组0的扇区0和扇区7处、  

在擦除扇区8-15期间,闪存 组0中的这些扇区中没有源代码。  当擦除 组0的扇区时--系统复位发生在以下 FAPI 指令上。

STATUS=Fapi_setActiveFlashBank (((Fapi_FlashBankType) 0);

我已将 TMS570LS3137设置为安全模式(启用所有安全功能),并执行所有安全库启动代码。

此外、如果必须将闪存 API 复制到 RAM 并为组0执行擦除和写入操作、请告诉我。

此外,请帮助我处理源代码如何   在运行时将闪存 API 库加载到 RAM 中(.test,.const),因为如果我们在最初时将闪存 API 库加载到 RAM 中,SRAM 测试将失败,如.cmd 文件中所示。

我想在 SRAM 测试完成后的运行时执行以下复制过程。

load = flash_API、run = SRAM、load_start (api_load)、run_start (api_run)、size (api_size)

在擦除闪存 组0的扇区8至15时、是否应该注意任何勘误表

下图显示了复位发生前闪存包装程序的寄存器

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

    1.要擦除/编程 Bank0中的扇区、必须从单独的闪存组或从 SRAM 执行闪存 API 相关的代码。 若要将这些段复制到 SRAM、请执行以下操作:
    a:定义包含所有 API 相关函数的输出段、然后将其分配到闪存进行加载、并分配 SRAM 进行运行
    b.在 main()或 startup ()中,请将这些输出段复制到 SRAM (请参阅 bootloader 中的示例)

    仅将 F021 API 复制到 SRAM 是不够的。 以下函数也应复制到 RAM:
    a. fapi_UserDefinedFuncions.obj
    B.调用 F021 API 的函数
    因此输出段应包含这些对象。

    2.最好也将变量或常量(例如在 flash_defines.h 中定义的闪存扇区)复制到 SRAM。
    .const:{}palign =8 load=FLASH0 |FLASH1、run = SRAM、load_start (constLoadStart)、run_start (constRunStart)、size (constLoadSize)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,QJ Wang 先生,


    1.感谢花时间详细解释擦除组0的过程。 如果 只有使用的扇区被锁定,是否有可能不会锁定整个闪存组0。  

    2.如果我将闪存 API 加载到 RAM 中、我正在实施的安全应用程序具有 SRAM_ResetTest、并且代码始终挂起  

    /*等待 PBIST 完成 PBIST 和 STC ROM */
    while ((systemREG1->MSTCGSTAT & 0x1U)== 0U){};

    3.是否有解决 SRAM 测试失败的方法。

    4.我了解从 RAM 运行闪存 API 的要求,并遵循引导加载程序示例,但我没有在安全应用程序中使用 RAM 加载和 RAM 执行的灵活性。

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

    您好,QJ Wang 先生,


    1.感谢花时间详细解释擦除组0的过程。 如果 只有使用的扇区被锁定,是否有可能不会锁定整个闪存组0。  

    2.如果我将闪存 API 加载到 RAM 中、我正在实施的安全应用程序具有 SRAM_ResetTest、并且代码始终挂起  

    /*等待 PBIST 完成 PBIST 和 STC ROM */
    while ((systemREG1->MSTCGSTAT & 0x1U)== 0U){};

    3.是否有解决 SRAM 测试失败的方法。

    4.我了解从 RAM 运行闪存 API 的要求,并遵循引导加载程序示例,但我没有在安全应用程序中使用 RAM 加载和 RAM 执行的灵活性。

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

    清除 FBPROT 的 PROTL1DIS 位将启用组保护、防止写入。 组扇区使能寄存器(BSE)用于启用/禁用用于编程或擦除访问的扇区。 复位后的默认设置为"禁用"

    2.最好在将闪存 API 从闪存复制到 SRAM 之前运行 SRAM_ResetTest。 测试前所选存储器的内容将在 PBIST 测试后完全丢失。 如果在 PBIST 测试之前运行闪存副本、代码必须处理数据备份。 通常、PBIST 测试在应用软件的开始执行。

    您需要等待通过轮询系统模块中 MSTCGSTAT 寄存器的 MSTDONE 位来完成 PBIST 自检。 如果它永远循环、您需要弄清楚问题的原因。
    A. PBIST 序列是否正确?
    b.所选存储器是否在您的器件中实现?
    c.所选存储器是否允许使用测试算法?
    d.是否在选择 RAM 组之前对 Over 进行编程:RINFLL、RINFUU?
    如果同一代码在另一个电路板上工作、则故障电路板上的器件可能会损坏。

    4.在您的应用程序中,您可以将代码复制到 SRAM 并从 SRAM 执行代码。 这不应受到引导加载程序的影响。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Qj Wang 先生,

    闪存存储器映射如下(这与建议的 0x00000000到0x00020000引导加载程序不同):

    0x00000000到0x000A0000 --具有严格 SIL2认证的安全关键型应用软件(我正在使用引导加载程序擦除和重新写入这些位置)

    0x000C0000到0x000E0000 --引导装载程序软件不安全(我正在使用从这个位置运行的引导装载程序来擦除和写入上面提到的应用程序)

    我正在使用的安全关键型应用源代码具有严格 的 SIL2规则,因此它启用了所有的异常,并将专用的闪存地址0x00000000到0x000A0000映射为 SIL2安全关键型软件位置, 我不允许将其重新定位到这些闪存位置的不同地址(我使用的是引导加载程序,我将重写应用程序)。

    如果我将 SIL2认证源代码从0x00000020移动到0x00040000开始,则会发生_undef 异常。  ;重置中止堆栈,因为此处理程序不可重入,在某些情况下由 longjmp 留下

    目前,位于0x000C0000的引导加载程序项目具有 Debug Build,无法将 IVT 地址0x00000000重新写入0x00000020 ,它适用于所有其它0x00000020到0x00300000 扇区0,通过扇区27重新写入 我知道.intvecs 被映射到 地址0x00000000到0x00000020 这是否意味着永远不会擦除.intvecs? ,是否有权变措施,因为我们的项目需要此解决方案。

    感谢您为解决所有问题(扇区0除外)提供了广泛的解释。 我现在已禁用 SRAM PBIST 测试和闪存 PBIST 测试。  

    我现在已经将(.text、.const of Flash API Library)的受控副本执行到 RAM 中,并设置 FBPROT 的 PROTL1DIS 位  (实现为 Flash_register.FBPROT=1;)。

    闪存 API:

    --library= F021_API_CortexR4_be_V3D16.lib <实用程序.GetNumberOfSecvers.obj >(.text:Fapi_getNumberOfBankSecors)
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.InitializeFlashBanks.obj >(.text:Fapi_initializeFlashBanks)
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.SetActiveBank.obj >(.text:Fapi_setActiveFlashBank)
    --library= F021_API_CortexR4_be_V3D16.lib < Program.obj >(.text:Fapi_issueProgrammingCommand)
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.EnableMainSecvs.obj >(.text:Fapi_enableMainBankSecors)
    --library= F021_API_CortexR4_be_V3D16.lib < Read.Common.obj >(.text:_Fapi_MargenterinMode)
    --library= F021_API_CortexR4_be_V3D16.lib < Read.MarginByByByByByByByByByByByByByByByByByByByByByByByByByByByByByte >(.text:Fapi_doMarginReadByByByByByByBy
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.IssueFsmCommand.obj >(.text:_Fapi_issueFsmCommand)
    --library= F021_API_CortexR4_be_V3D16.lib <实用程序.CalculateFletcher.obj >(.text:Fapi_calculateFletcherChecksum)
    --library= F021_API_CortexR4_be_V3D16.lib < ASYNC.WithAddress.obj >(.text:Fapi_issue193CommandWithAddress)
    --library= F021_API_CortexR4_be_V3D16.lib < Utilities.WaitDelay.obj >(.text:Fapi_waitDelay)
    --library= F021_API_CortexR4_be_V3D16.lib < Read.Common.obj >(.text:_Fapi_exitMarginMode)
    --library= F021_API_CortexR4_be_V3D16.lib < read.FlushPipeline.obj >(.text:fapi_flushPipeline)
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.InitializeFlashBanks.obj >(.text:_Fapi_divedUnsignedLong)
    --library= F021_API_CortexR4_be_V3D16.lib <实用程序.CalculateEcc.obj >(.text:Fapi_calculateEcc)
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.ScaleFclk.obj >(.text:_scaleEEFclk)
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.ScaleFclk.obj >(.text:_scaleMainFclk)
    --library= F021_API_CortexR4_be_V3D16.lib < read.wdService.obj >(.text:_Fapi_checkWdService)
    --library= F021_API_CortexR4_be_V3D16.lib < BlankCheck.ByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.EnableEpromSectics.obj >(.text:Fapi_enableEpromBankSectors)
    --library= F021_API_CortexR4_be_V3D16.lib < Read.LoopByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByte >(.text:_Fapi_loopRegionForValueByByByByBy
    --library= F021_API_CortexR4_be_V3D16.lib < FlashStateMachine.EnableEpromSecvs.obj >(.text:_Fapi_EnableSecors)

    boot_flash.obj (.bss、.data、.text、.const)
    boot_erase.obj (.bss、.data、.text、.const)
    boot_ca_Upd.obj (.bss、.data、.text、.const)
    BOOT_EMIF_Write_Data.obj (.bss、.data、.text、.const)


    }load = flash_API、run = SRAM、load_start (unsafe _load_start)、run_start (unsafe _run_start)、size (unsafe _run_size)

    ;------------------------------------------------------------------

    ;将闪存 API 从闪存复制到 SRAM。


    .def _Boot_copyAPI 2RAM_
    asmfunc

    Boot_API copy2RAM_

    .ref unsafe load_start
    FLASH_LOAD .word unsafe 加载启动
    .ref unsafe _run_start
    flash_run .word unsafe _run_start
    .ref unsafe _run_size
    flash_size .word unsafe _run_size

    LDR r0、FLASH_LOAD
    LDR R1、FLASH_RUN
    LDR R2、FLASH_SIZE
    添加 R2、R1、R2
    COPY_Loop1:
    LDR R3、[r0]、#4
    STR R3、[R1]、#4
    CMP R1、R2
    BLT COPY_LOOP1
    BX LR

    endasmfunc

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

    您的引导加载程序不在 sector0中、因此必须首次通过 JTAG 对应用程序进行编程。 每次应用程序在复位(SW、CPU、nPORRST 等)后首先执行、并有条件地跳转到引导加载程序(外部命令)。

    引导加载程序是否能够擦除其他扇区、例如扇区13/14?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,QJ Wang 先生,

    如果跳转地址(_c_int00的)超出扇区0、则会发生_undef 异常、例如... 微控制器上电时为0x00008000地址。

    我想控制组0的扇区0。 您能不能帮助我解释 INTERPOUT 矢量表的前20个字。

    源代码在地址000052b4生成_c_int00、但指向_c_int00的闪存位置为 EA0014AB

    下面提供的前20个字意味着如何解码这些字

    EA0014ABEA03FFFEEA03FFFEEA03FFFE EA03FFFE EA03FFFE EAFFFFEE51FF1B0E51FF1B0


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

    您好 Chantren、

    当一个异常发生时、处理器必须执行与该异常相对应的处理程序代码。 存储器中存储处理程序的位置称为异常向量。 在 ARM Cortex-R4/R5中、异常向量存储在一个被称为异常向量表的表中。 该表包含将内核定向到完整异常处理程序的分支指令。

    ARM Cortex-R4/5上异常向量的基地址为0x00000000、不可编程。

    这是异常向量(ARM Cortex-R4 TRM)的定义:

    EA0014AB EA03FFFE EA03FFFE EA03FFFE EA03FFFE EA03FFFE EAFFFFE E51FF1B0 E51FF1B0

    第一个字是_c_int00 () -- b _c_int00的分支指令

    2.第2个字~第5个字是 分支到自身的指令

    3.保留第6个

    最后两个用于 IRQ 和 FIQ

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

    您好,QJ Wang 先生,

    感谢您花时间详细解释前8个词。

    以下是我的理解。

    操作码 EA 代表分支

    EA --分支指令,后跟从当前地址分支的3个字节的相对地址   ( 以32位倍数表示,因为 TMS570LS3137是32位控制器)。

    现在我了解到 EA0014AB 是指从当前地址到 如此多的字(32位或4字节)的分支相对地址,因为程序计数器应该在0x000052AC 上加载_c_int00。
    入口点符号:"_c_int00"地址:000052ac


    对于 EA03FFFE EA03FFFE EA03FFFE EA03FFFE EA03FFFE EA03FFFE EA03FFFE EA03FFFE EAAFFFFE、我了解当我们分解为操作码时、它如下所示


    此处为 BAL;分支汇编到0xEAFFFFFE (注意 PC 偏移的影响)。

    再次感谢,