AnsweredAssumed Answered

Higher temperature problems

Question asked by Ken Steenis on Jun 20, 2018
Latest reply on Jul 3, 2018 by Bernhard Fink

I have a bootloader running on an LPC1752. This bootloader jumps to my main software after a few seconds.

This is already working for years! But recently we discovered a device that is not working properly because of a highter ambient temperature.

 

If the ambient is higher (~65Celcius) the bootloader starts, but on the moment it should switch to the main program it doesn't do anything. I can't connect using the jtag/swj debugger and really need to reset the device to start again.

If I flash my main program as start program instead of the bootloader the software does boot normally under the hot condition.

 

If the main software is already running before we get to the higher temperatures the devices runs as expected, meaning the problem is in the jump at line 39?

 

void NormalProgramCall(uint32_t *Address)
{
   
    // Disable all enabled interrupts in NVIC.
    NVIC->ICER[ 0 ] = 0xFFFFFFFF ;
    NVIC->ICER[ 1 ] = 0xFFFFFFFF ;
    NVIC->ICER[ 2 ] = 0xFFFFFFFF ;
    NVIC->ICER[ 3 ] = 0xFFFFFFFF ;
    NVIC->ICER[ 4 ] = 0xFFFFFFFF ;
    NVIC->ICER[ 5 ] = 0xFFFFFFFF ;
    NVIC->ICER[ 6 ] = 0xFFFFFFFF ;
    NVIC->ICER[ 7 ] = 0xFFFFFFFF ;
   
    //Clear all pending interrupt requests in NVIC.
    NVIC->ICPR[ 0 ] = 0xFFFFFFFF ;
    NVIC->ICPR[ 1 ] = 0xFFFFFFFF ;
    NVIC->ICPR[ 2 ] = 0xFFFFFFFF ;
    NVIC->ICPR[ 3 ] = 0xFFFFFFFF ;
    NVIC->ICPR[ 4 ] = 0xFFFFFFFF ;
    NVIC->ICPR[ 5 ] = 0xFFFFFFFF ;
    NVIC->ICPR[ 6 ] = 0xFFFFFFFF ;
    NVIC->ICPR[ 7 ] = 0xFFFFFFFF ;
   
    //Disable SysTick and clear its exception pending bit,
    SysTick->CTRL = 0 ;
    SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk;
   
   
    //Disable individual fault handlers if the bootloader used them.
    SCB->SHCSR &= ~(     SCB_SHCSR_USGFAULTENA_Msk | SCB_SHCSR_BUSFAULTENA_Msk | SCB_SHCSR_MEMFAULTENA_Msk ) ;

    // Load the vector table address of the user application into SCB->VTOR register
    SCB->VTOR = ( uint32_t )Address ;
   
    // Set the MSP to the value found in the user application vector table.
    __set_MSP( Address[ 0 ] ) ;
   
    // Set the PC to the reset vector value of the user application via a function call.
    ( ( void ( * )( void ) )Address[ 1 ] )( ) ;           /////////// After this PC set the processor halts

}

Outcomes