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: bootloard更新程序进行编程操作无法读内部flash

Part Number: TMS570LS3137


bootloard升级中编程时的问题 目前代码采用bank0存放IAP程序,bank1存放APP程序,通过外部存储器存放固件包。升级中出现以下两点问题:

(1)在IAP升级时进行擦除操作 调用uint32_t Fapi_BlockErase( uint32_t Bank, uint32_t ulAddr, uint32_t Size)此函数,不能执行读操作函数 status =  Flash_Erase_Check((uint32_t)ulAddr, Size),执行后单片机出现异常跑飞;

(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_Of_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 */
}

  • 您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 您好,

    从您的LInker CMD文件来看,您把固件编程到bank 0 (与 bootloader相同的bank)。

    如果将固件编程到同一个bank,那么需要将闪存 API 和相关代码复制到 SRAM,并从 SRAM 执行这些代码。

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

    flashAPI :
    {
    ..\Debug\F021\source\Fapi_UserDefinedFunctions.obj (.text, .data)
    ..\Debug\F021\source\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)

  • 你好,我不是编程到同一个bank内,我是通过bank0存放bootloader,ban1存放app。我现在在ban0中编程到ban1时发现不能读取ban1的数据。一读程序就跑飞,上面写的那个linker cmd是bootloader程序的。那如果我后续项目做成同一个bank内,那个linker cmd按你这样修改就可以了吗?

  • 我们向工程师确认下哈。

  • 您好,

    那如果我后续项目做成同一个bank内,那个linker cmd按你这样修改就可以了吗?

    对的。

    如果您将应用程序编程到 bank1,那么可以从bank0运行闪存 API。 

  • 具体怎样操作呢?bootloader的linker cmd怎样修改呢?就目前我的bootloader代码,我也在_c_int00函数调用main函数之前调用了 _copyAPI2RAM_()

  • 我们跟进给工程师看下哈,应该会在下一个工作日给到您答复。

  • 您好,

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

    工程师会复制 FLASH_defines.h 中定义的闪存扇区, 如果您使用了我们在之前回复中提到的修改后的linker cmd,应该删除 FLASH_Sector 的 const:

    flashAPI :
    {
    ..\Debug\F021\source\Fapi_UserDefinedFunctions.obj (.text, .data)
    ..\Debug\F021\source\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 defined (TMS570LS07) || defined (RM44)
    #define NUMBEROFSECTORS 12
    const SECTORS flash_sector[NUMBEROFSECTORS]=
    {

    (该段代码不太准确,您请参考英文论坛工程师的答复,链接如下: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/4368899#4368899)

    不能执行读操作函数 status =  Flash_Erase_Check((uint32_t)ulAddr, Size),执行后单片机出现异常跑飞;

    要检查空白闪存扇区的话,应该要禁用闪存 ECC。 否则将会有不可纠正的 ECC 错误和数据中止。 

    执行uint32_t Flash_Program_Check(uint32_t Program_Start_Address, uint32_t Source_Start_Address, uint32_t No_Of_Bytes)后,单片机跑飞。

    您是用了 Fapi_issueProgrammingCommand()对 ECC 进行编程吗?

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