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:已对引导加载程序进行编程、无法读取内部闪存

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160079/tms570ls3137-the-bootloader-is-programd-and-the-internal-flash-cannot-be-read

器件型号:TMS570LS3137

大家好、

以下是客户提出的问题、可能需要您的帮助:

在升级编程时、引导加载程序当前使用 bank0用于 IAP 程序、bank1用于应用程序、并使用外部存储器用于固件包。 升级有2个问题:  

1)在 IAP 升级时擦除、调用函数 uint32_t fapi_BlockErase (uint32_t Bank、uint32_t ulAddr、uint32_t size)。 无法读取函数状态= Flash_Erase_Check (((uint32_t) ulAddr、size)、执行后出现单片异常。  

2) 2)编程 uint32_t Fapi_BlockProgram (uint32_t Bank、uint32_t Flash_Address、uint32_t Data_Address、uint32_t SizeInBytes)、并执行 uint32_t Flash_Program_Check (uint32_t Program_Start_Address、uint32_t Source_Start_Address、uint32_t NO_OFF_Bytes)、单片无法正常工作。

IAP 程序链接脚本配置如下:  

MEMORY
{
VECTORS (X) : origin=0x00000000 length=0x00000020
FLASH_API (RX) : origin=0x00000020 length=0x000014E0
FLASH0 (RX) : origin=0x00001500 length=0x00180000-0x00001500
// FLASH1 (RX) : origin=0x00180000 length=0x00180000
STACKS (RW) : origin=0x08000000 length=0x00001500
RAM (RW) : origin=0x08001500 length=0x0003EB00

/* USER CODE BEGIN (2) */
/* USER CODE END */
}

/* USER CODE BEGIN (3) */
/* USER CODE END */


/*----------------------------------------------------------------------------*/
/* Section Configuration */

SECTIONS
{
.intvecs : {} > VECTORS

flashAPI :
{
..\Debug\F021\source\Fapi_UserDefinedFunctions.obj (.text)
..\Debug\F021\source\bl_flash.obj (.text)
--library=..\F021\F021_API_CortexR4_BE.lib < FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.SetActiveBank.obj
FlashStateMachine.InitializeFlashBanks.obj
FlashStateMachine.EnableMainSectors.obj
FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.ScaleFclk.obj
Init.obj
Utilities.CalculateEcc.obj
Utilities.WaitDelay.obj
Utilities.CalculateFletcher.obj
Read.MarginByByte.obj
Read.Common.obj
Read.FlushPipeline.obj
Read.WdService.obj
Async.WithAddress.obj
Program.obj > (.text)
} load = FLASH_API, run = RAM, LOAD_START(api_load), RUN_START(api_run), SIZE(api_size)

.text : {} > FLASH0
.const : {} > FLASH0
.cinit : {} > FLASH0
.pinit : {} > FLASH0
.bss : {} > RAM
.data : {} > RAM
.sysmem : {} > RAM

/* USER CODE BEGIN (4) */
/* USER CODE END */
}

您可以帮助检查此案例吗? 谢谢。

此致、

樱桃

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

    您好、Cherry、

    从链接器 CMD 文件中、您将固件编程到组0 (与引导加载程序相同的组)。

    如果将固件编程到同一组、则需要将闪存 API 和相关代码复制到 SRAM、并从 SRAM 执行这些代码。

    请将.text 和.data 复制到 SRAM:

    闪存 API:

    ..\Debug\F021\Sources\Fapi_UserDefinedFunctions.obj (.text、.data)
    ..\Debug\F021\Sources\BL_flash.obj (.text、.data)
    --library=..\F021\F021_API_CortexR4_be.lib (.text、.data)
    }load = flash_API、run = RAM、load_start (api_load)、run_start (api_run)、size (api_size)

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

    您好!

    感谢你的帮助。

    客户无需编程到同一个存储库中、而是通过 bank0存储引导加载程序、并通过 ban1存储应用程序。

    当编程到带0中的带1时、发现它无法读取带1的数据。 上面写入的链接器 cmd 用于引导加载程序。

    如果他们在同一个库中对后续项目进行编程、链接器 cmd 会按照您的建议对其进行修改、对吧?

    谢谢、此致、

    樱桃

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="496057" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160079/tms570ls3137-the-bootloader-is-programd-and-the-internal-flash-cannot-be-read/4364709 #4364709"]如果他们对同一组中的后续项目进行编程、链接器 cmd 会按照您的建议对其进行修改、对吗?

    是的。  

    如果您将应用程序编程到 bank1、则可以从组0运行闪存 API。

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

    您好!

    [引用 userid="45190" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160079/tms570ls3137-the-bootloader-is-programd-and-the-internal-flash-cannot-be-read/4365938 #4365938"]如果您将应用程序编程到 bank1,则可以在组0之外运行闪存 API。

    如何修改引导加载程序的链接器 cmd?

    在_c_int00函数调用 main 函数之前、客户的引导加载程序代码也会调用_API copy2RAM_()。

    谢谢、此致、

    樱桃

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

    您好、Cherry、

    使用原始链接器 cmd 文件、_API copy2RAM_()只将.text 段从闪存复制到 SRAM。  

    我想复制 FLASH_defines.h 中定义的闪存扇区 如果您使用我在上一条消息中提到的修改后的链接器 cmd、应该删除 FLASH_Sector 的 const:

    闪存 API:

    ..\Debug\F021\Sources\Fapi_UserDefinedFunctions.obj (.text.data)
    ..\Debug\F021\Sources\BL_flash.obj (.text.data)
    --library=..\F021\F021_API_CortexR4_be.lib (.text.data)
    }load = flash_API、run = RAM、load_start (api_load)、run_start (api_run)、size (api_size)

    #IF 定义(TMS570LS07)||定义(RM44)
    #define NUMBEROFSECTORS 12.
    CONST 扇区 FLASH_SECTOR[NUMBEROFSECTORS]=

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="496057" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160079/tms570ls3137-the-bootloader-is-programd-and-the-internal-flash-cannot-be-read ]无法读取函数状态= Flash_Erase_Check ((uint32_t) ulAddr、size)、执行后发生单片异常。  [/报价]

    要检查空白闪存扇区、应禁用闪存 ECC。 否则、您将获得不可纠正的 ECC 错误和数据中止。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="496057" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160079/tms570ls3137-the-bootloader-is-programd-and-the-internal-flash-cannot-be-read ]执行 uint32_t Flash_Program_Check (uint32_t Program_Start_Address、uint32_t Source_Start_Address、uint32_t NO_OFF_Bytes)、单片无法正常工作。[/quot]

    是否使用 Fapi_issueProgrammingCommand()对 ECC 进行编程?

    是  Flash_Program_Check (..)中的 No_OFF_Bytes 与应用程序映像的大小相同? 如果 No_OFF_BYTES >应用程序映像的长度、 Flash_Program_Check (..) 将读取具有无效 ECC 值(0xFF)的闪存数据(0xFFFFFFFF FFFFFFFF)。