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.

Interrupts stop working if app is loaded with a custom bootloader

Hi,

I have a problem where application is loaded with a custom bootloader, and seems to work fine, but until some interrupt occurs. After that it hangs. If I disable interrupts, or just make sure they don't occur (when enabled) - app works fine.

Also if I load the app without the custom bootloader (directly into 0x0 address) - interrupts work fine.

I searched through the forums but couldn't find anything that can help solve that.

Can somebody point me to what the error might be?

Here is some code:

The linker of the application:

#define APP_BASE 0x0000500c
#define RAM_BASE 0x20000000

MEMORY
{
    FLASH (RX) : origin = APP_BASE, length = 0x0003aff4
    SRAM (RWX) : origin = RAM_BASE, length = 0x00008000
}

SECTIONS
{
    .intvecs:   > APP_BASE
    .text   :   > FLASH
    .const  :   > FLASH
    .cinit  :   > FLASH
    .pinit  :   > FLASH
    .init_array : > FLASH

    .vtable :   > RAM_BASE
    .data   :   > SRAM
    .bss    :   > SRAM
    .sysmem :   > SRAM
    .stack  :   > SRAM
}

__STACK_TOP = __stack + 512;

The linker of the bootloader:

#define APP_BASE 0x00000000
#define RAM_BASE 0x20000000

MEMORY
{
    FLASH (RX) : origin = APP_BASE, length = 0x00005000
    SRAM (RWX) : origin = RAM_BASE, length = 0x00008000
}


SECTIONS
{
    .intvecs:   > APP_BASE
    .text   :   > FLASH
    .const  :   > FLASH
    .cinit  :   > FLASH
    .pinit  :   > FLASH
    .init_array : > FLASH

    .vtable :   > RAM_BASE
    .data   :   > SRAM
    .bss    :   > SRAM
    .sysmem :   > SRAM
    .stack  :   > SRAM
}

__STACK_TOP = __stack + 512;

The bootloader function for calling the application, the address given is 0x0000500c:

void callApplication(unsigned long ulStartAddr)
{

    ROM_SysTickIntDisable();
    ROM_SysTickDisable();

    HWREG(NVIC_DIS0) = 0xffffffff;
    HWREG(NVIC_DIS1) = 0xffffffff;

    HWREG(NVIC_VTABLE) = ulStartAddr;

    //
    // Load the stack pointer from the application's vector table.
    //
    __asm("    ldr     r1, [r0]\n"
          "    mov     sp, r1\n");

    //
    // Load the initial PC from the application's vector table and branch to
    // the application's entry point.
    //
    __asm("    ldr     r0, [r0, #4]\n"
          "    bx      r0\n");
}

The startup scripts are the default ones, just the interrupt handlers added.

Any idea what may be wrong here?

PS: one note that bootloader is situated at 0x0 -> 0x00005000, while app starts at 0x0000500c

The space between 5000 and 500c is used for CRC, length, etc. I noticed that in the boot_demo2 code, in startup_ccs.c those CRC, len, etc. bytes are set at the end of the vector table. Do I need to do this? Could this be related somehow?

Thanks in advance!