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.

TMS320F28375S: POR works but XRS doesn't

Part Number: TMS320F28375S
Other Parts Discussed in Thread: C2000WARE

I have a board which i can program with the XDS110 debugger and runs perfectly well when this is attached.  However when run from FLASH without the debugger the board runs normally following a Power on Reset but doesn't run when reset using XRS.

XRS has a 2k2 pull up and 10nF to ground. 

TRST has 2k2 pull down.

Z1_BOOTCTRL is set to 0x5E5D0B5A which i think is boot from flash using GPIO 78 and 79 as boot select.  78/79 are normally pulled high.  The rest of the OTP is set to 1s.

Interestingly if i pull GPIO78/79 low then it operates correctly from XRS but not from POR - however i think this may be misleading.

While the application code is rather more complicated.  I have replicated this with a basic flashing LED example based on the first example in C2000Ware.  The relevant extracts are below - minimal changes from the stock.  The boot pins and clock have been changed because of board constraints.  

It appears that on XRS the PC is at 0x3FEFB3, whereas the start of main is 0x085025 however i do not understand why these two things are different or how to change the entry point of XRS, any help is greatly appreciated.  Specifically;

1. Are there different entry points for XRS vs POR and if so how do i set them?

2. Is there anything i've missed in the OTP which i need to set to enable the correct behaviour

What else have i missed?

#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_OSC2 | SYSCTL_IMULT(40) | \
SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) | \
SYSCTL_PLL_ENABLE)

Main.c

#include "driverlib.h"
#include "device.h"

#define LED1_PIN 66
#define LED1_CFG GPIO_66_GPIO66
#define LED_DIR GPIO_DIR_MODE_OUT
#define LED_TYPE GPIO_PIN_TYPE_STD

//
// Main
//
void main(void)
{
// device Initialisation
Device_init();

//Initialise GPIO and configure the GPIO pin as a push-pull output
Device_initGPIO();
//Initialise PIE and clear PIE registers. Disables CPU interrupts
Interrupt_initModule();
//Initialise the PIE vector table
Interrupt_initVectorTable();

GPIO_setPinConfig(LED1_CFG);
GPIO_setDirectionMode(LED1_PIN, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(LED1_PIN, GPIO_PIN_TYPE_STD);


//Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
EINT;
ERTM;

//Loop forever
while(1)
{
//Turn on LED
GPIO_writePin(LED1_PIN, 0);

//Delay for a bit
DEVICE_DELAY_US(100000);

//Turn off LED
GPIO_writePin(LED1_PIN, 1);

//Delay for a bit
DEVICE_DELAY_US(100000);

}
}

F2837xD_CodeStartBranch.asm

-----------------------------------------------------------------------------------------------------------------------------------------------
***********************************************************************

WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0

.ref _c_int00
.global code_start

***********************************************************************
* Function: codestart section
*
* Description: Branch to code starting point
***********************************************************************

.sect "codestart"
.retain

code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _c_int00 ;Branch to start of boot._asm in RTS library
.endif

;end codestart section

***********************************************************************
* Function: wd_disable
*
* Description: Disables the watchdog timer
***********************************************************************
.if WD_DISABLE == 1

.text
wd_disable:
SETC OBJMODE ;Set OBJMODE for 28x object code
EALLOW ;Enable EALLOW protected register access
MOVZ DP, #7029h>>6 ;Set data page for WDCR register
MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD
EDIS ;Disable EALLOW protected register access
LB _c_int00 ;Branch to start of boot._asm in RTS library

.endif

;end wd_disable

.end

;//
;// End of file.
;//

2837xS_Generic_FLASH_lnk.cmd 

MEMORY
{
PAGE 0 : /* Program Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
/* BEGIN is used for the "boot to Flash" bootloader mode */

BEGIN : origin = 0x080000, length = 0x000002
RAMM0 : origin = 0x000123, length = 0x0002DD
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RESET : origin = 0x3FFFC0, length = 0x000002

/* Flash sectors */
/* BANK 0 */
FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */
FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */
FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */
FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */
FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */
FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */
FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */
FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */
FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */
FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */
FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */
FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */
FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */
FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chip Flash */

/* BANK 1 */
FLASHO : origin = 0x0C0000, length = 0x002000 /* on-chip Flash */
FLASHP : origin = 0x0C2000, length = 0x002000 /* on-chip Flash */
FLASHQ : origin = 0x0C4000, length = 0x002000 /* on-chip Flash */
FLASHR : origin = 0x0C6000, length = 0x002000 /* on-chip Flash */
FLASHS : origin = 0x0C8000, length = 0x008000 /* on-chip Flash */
FLASHT : origin = 0x0D0000, length = 0x008000 /* on-chip Flash */
FLASHU : origin = 0x0D8000, length = 0x008000 /* on-chip Flash */
FLASHV : origin = 0x0E0000, length = 0x008000 /* on-chip Flash */
FLASHW : origin = 0x0E8000, length = 0x008000 /* on-chip Flash */
FLASHX : origin = 0x0F0000, length = 0x008000 /* on-chip Flash */
FLASHY : origin = 0x0F8000, length = 0x002000 /* on-chip Flash */
FLASHZ : origin = 0x0FA000, length = 0x002000 /* on-chip Flash */
FLASHAA : origin = 0x0FC000, length = 0x002000 /* on-chip Flash */
FLASHBB : origin = 0x0FE000, length = 0x001FF0 /* on-chip Flash */

// FLASHBB_RSVD : origin = 0x0FFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

PAGE 1 : /* Data Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */

BOOT_RSVD : origin = 0x000002, length = 0x000121 /* Part of M0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */
// RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RAMD1 : origin = 0x00B800, length = 0x000800

RAMLS5 : origin = 0x00A800, length = 0x000800

RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x000FF8
// RAMGS11_RSVD : origin = 0x017FF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
}

SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHB PAGE = 0, ALIGN(8)
.pinit : > FLASHB, PAGE = 0, ALIGN(8)
.text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(8)
codestart : > BEGIN PAGE = 0, ALIGN(8)

/* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE = 1
#if defined(__TI_EABI__)
.init_array : > FLASHB, PAGE = 0, ALIGN(8)
.bss : > RAMLS5, PAGE = 1
.bss:output : > RAMLS3, PAGE = 0
.bss:cio : > RAMLS5, PAGE = 1
.data : > RAMLS5, PAGE = 1
.sysmem : > RAMLS5, PAGE = 1
/* Initalized sections go in Flash */
.const : > FLASHF, PAGE = 0, ALIGN(8)
#else
.pinit : > FLASHB, PAGE = 0, ALIGN(8)
.ebss : >> RAMLS5 | RAMGS0 | RAMGS1, PAGE = 1
.esysmem : > RAMLS5, PAGE = 1
.cio : > RAMLS5, PAGE = 1
/* Initalized sections go in Flash */
.econst : >> FLASHF PAGE = 0, ALIGN(8)
#endif

/* Initalized sections go in Flash */
.switch : > FLASHB PAGE = 0, ALIGN(8)

.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */

#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
#if defined(__TI_EABI__)
.TI.ramfunc : {} LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
#else
.TI.ramfunc : {} LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
#endif
#else
ramfuncs : LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
#endif
#endif

ramgs0 : > RAMGS0, PAGE = 1
ramgs1 : > RAMGS1, PAGE = 1

/* The following section definitions are for SDFM examples */
Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111
Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222
Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333
Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444
Difference_RegsFile : >RAMGS5, PAGE = 1, fill=0x3333
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

  • Z1_BOOTCTRL is set to 0x5E5D0B5A which i think is boot from flash using GPIO 78 and 79 as boot select. 

    5Eh is 94, which makes  GPIO93 the boot-pin. Likewise, 5Dh makes GPIO92 the boot-pin. Can you please double-check this?

    It appears that on XRS the PC is at 0x3FEFB3,

    Correct, the first entry point is in boot-ROM.

    whereas the start of main is 0x085025

    0x85025 is in Flash, which is where your code is. 

    however i do not understand why these two things are different or how to change the entry point of XRS,

    After any reset, the first point of entry is always in the Boot-ROM. The boot-ROM code takes a snapshot of the boot-mode-select pins and determines which boot-mode to use. In your case it is flash, so the device will branch to a specific location in Flash. That location will contain a branch instruction to your application. Entry-point for -XRS in Boot-ROM is fixed. That cannot be changed.

    1. Are there different entry points for XRS vs POR and if so how do i set them?

    No. 

  • Hareesh, thank you for your response.

    Apologies.  My original message should have read Z1_BOOTCTRL is 0x4E4F0B5A which matches with the description of the GPIOs above being 78/79

    It appears that on XRS the PC is at 0x3FEFB3,

    Correct, the first entry point is in boot-ROM.

    But following an XRS it seems to get stuck there and doesn't enter the project code.

    Tomorrow i will attempt to reconfigure the programmer to connect to a running processor (without reset) and see if i can understand where it's getting stuck.  Is there anything i should be looking out for?

  • Is there any way to confirm what values the BOOTROM read from the boot-pins? Or which boot option it will take based on them?

  • But following an XRS it seems to get stuck there and doesn't enter the project code.

    It is not “stuck” there. When the device is under the control of the debugger (CCS), code does not free-run by default. The command for that should be given through the IDE. For example, you could single-step or run your code etc.

    But following an XRS it seems to get stuck there and doesn't enter the project code.

    I don’t get a feeling it is actually “stuck” anywhere. What I think is happening is that a boot-mode other than Flash is chosen and the device is just waiting there for data from a host. You are interpreting this waiting as “getting stuck”.

    Is there any way to confirm what values the BOOTROM read from the boot-pins? Or which boot option it will take based on them?

    Yes. You can load the boot-ROM symbols from C:\ti\c2000\C2000Ware_4_00_00_00\libraries\boot_rom\f2837xs\revB\rom_sources\ccs_files\cpu01\Release and then single-step through your boot-ROM code. Note that you will be in emulation boot-mode, not in standalone mode. I haven’t tried this myself but there should be a way to read the boot pins.

  • Hareesh, again thank you for your help.

    The link to the BOOTROM source and symbols was very helpful and actually let me get to the bottom of what is going on.  (it was hinted at in the first line of your first message Hareesh - i missed that).

    The GPIO pin selected by the BOOTCTRL register is one less than the value specified in the register.  This is in line with the TRM, it's also specified in the code from c1brom_boot.c

    uint16_t c1brom_decode_bootpins(uint16_t pinconfig)
    {
        uint16_t bootpin0 = 0;
        uint16_t bootpin1 = 0;
        uint16_t bmode = 0;
        //default boot pins - mode0 is GPIO84, mode1 is GPIO72
    
        if((pinconfig &0xFF) == 0x0)
        {
            bootpin0 = 84;
        }
        else
        {
            bootpin0 = (pinconfig & 0xFF) - 1;
        }

    Thanks again for your assistance.