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.

LAUNCHXL2-RM57L: Jump from Bootloader to Application after reset

Part Number: LAUNCHXL2-RM57L
Other Parts Discussed in Thread: HALCOGEN

I have been able to successfully port the Hercules_Ethernet_Bootloader example for LAUNCHXL2-RM57L in CCS version 10.4.0.00006.

My CCS project settings are:

  • Connection - XDS110 USB Debug Probe
  • Core - RM57L8xx
  • Compiler version - TI v20.2.0 LTS

Note that I am using bare-metal HalCoGen drivers.

Using Debug mode, I am able to successfully compile and run tftp-based Ethernet bootloader on my development kit and able to transfer an application binary (basic led blinking code) using tftpd utility.

My bootloader code spans Sectors0-8 of Flash Bank0. So, I have fixed my application's start address beginning with Sector-9 in bl_config.h as follows :-

#define APP_STATUS_ADDRESS       0x00C0000

 #define APP_START_ADDRESS       0x00C0020

The bootloader is able to receive the application code and run it. But, after I press the reset button, my application code is not able to load directly. I am trying to jump to my application from bootloader based on this check:

/* Check if update needed*/
    uint32_t *FlagPtr;
    FlagPtr = (uint32_t *)APP_STATUS_ADDRESS;
    if( *FlagPtr == 0x5A5A5A5A )
    {
        UARTprintf("Starting LED Application ... \n\r");
        g_ulTransferAddress = (uint32_t)APP_START_ADDRESS;
        ((void (*)(void))g_ulTransferAddress)();
    }

The HL_sys_link.cmd files are also attached for your reference:

************** Bootloader *****************


/*----------------------------------------------------------------------------*/
/* Linker Settings */

--retain="*(.intvecs)"

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

/*----------------------------------------------------------------------------*/
/* Memory Map */

MEMORY
{
/* USER CODE BEGIN (2) */
VECTORS (X) : origin=0x00000000 length=0x00000020 vfill = 0xffffffff
FLASH0 (RX) : origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff
FLASH1 (RX) : origin=0x00200000 length=0x00200000 vfill = 0xffffffff
RAM (RWX) : origin=0x08002000 length=0x0007E000
STACK (RW) : origin=0x08000000 length=0x00002000

#if 0
/* USER CODE END */
VECTORS (X) : origin=0x00000000 length=0x00000020
FLASH0 (RX) : origin=0x00000020 length=0x001FFFE0
FLASH1 (RX) : origin=0x00200000 length=0x00200000
STACKS (RW) : origin=0x08000000 length=0x00001500
RAM (RW) : origin=0x08001500 length=0x0007eb00

/* USER CODE BEGIN (3) */
#endif
#if 1
ECC_VEC (R) : origin=(0xf0400000 + (start(VECTORS) >> 3))
length=(size(VECTORS) >> 3)
ECC={algorithm=algoL2R5F021, input_range=VECTORS}

ECC_FLA0 (R) : origin=(0xf0400000 + (start(FLASH0) >> 3))
length=(size(FLASH0) >> 3)
ECC={algorithm=algoL2R5F021, input_range=FLASH0 }

ECC_FLA1 (R) : origin=(0xf0400000 + (start(FLASH1) >> 3))
length=(size(FLASH1) >> 3)
ECC={algorithm=algoL2R5F021, input_range=FLASH1 }
#endif
/* USER CODE END */
}

/* USER CODE BEGIN (4) */
ECC
{
algoL2R5F021 : address_mask = 0xfffffff8 /* Address Bits 31:3 */
hamming_mask = R4 /* Use R4/R5 build in Mask */
parity_mask = 0x0c /* Set which ECC bits are Even and Odd parity */
mirroring = F021 /* RM57Lx and TMS570LCx are build in F021 */
}
/* USER CODE END */


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

SECTIONS
{
/* USER CODE BEGIN (5) */
/* USER CODE END */
.intvecs : {} > VECTORS
.text align(32) : {} > FLASH0 | FLASH1
.const align(32) : {} > FLASH0 | FLASH1
.cinit align(32) : {} > FLASH0 | FLASH1
.pinit align(32) : {} > FLASH0 | FLASH1
.bss : {} > RAM
.data : {} > RAM
.sysmem : {} > RAM

/* USER CODE BEGIN (6) */
flashAPI:
{
.\Boot\Fapi_UserDefinedFunctions.obj (.text)
.\Boot\bl_flash.obj (.text, .data)
--library= "c:\ti\Hercules\F021 Flash API\02.01.01\F021_API_CortexR4_LE_L2FMC.lib" (.text, .data)
} palign=8 load = FLASH0 |FLASH1, run = RAM, LOAD_START(apiLoadStart), RUN_START(apiRunStart), SIZE(apiLoadSize)
/* USER CODE END */
}
/*----------------------------------------------------------------------------*/

************** Application *****************

/*----------------------------------------------------------------------------*/
/* Linker Settings */

--retain="*(.intvecs)"

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

/*----------------------------------------------------------------------------*/
/* Memory Map */

MEMORY
{
/* USER CODE BEGIN (2) */
/* USER CODE END */
//VECTORS (X) : origin=0x00000000 length=0x00000020
//FLASH0 (RX) : origin=0x00000020 length=0x001FFFE0
VECTORS (X) : origin=0x000C0000 length=0x00000020
FLASH0 (RX) : origin=0x000C0020 length=0x0013FFC0
FLASH1 (RX) : origin=0x00200000 length=0x00200000
STACKS (RW) : origin=0x08000000 length=0x00001500
RAM (RW) : origin=0x08001500 length=0x0007EB00

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

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


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

SECTIONS
{
/* USER CODE BEGIN (5) */
/* USER CODE END */
.intvecs : {} > VECTORS
.text align(32) : {} > FLASH0 | FLASH1
.const align(32) : {} > FLASH0 | FLASH1
.cinit align(32) : {} > FLASH0 | FLASH1
.pinit align(32) : {} > FLASH0 | FLASH1
.bss : {} > RAM
.data : {} > RAM
.sysmem : {} > RAM

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

Request your help to resolve this issue.