This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

bootloader_app_start vs NVIC_SystemReset();

Hi, i want to jump from my app to the bootloader, i used the function

void bootloader_app_start(void)

{

    vMBt_eStopAdv_Exe() ;// Stoping the BLE ADV 
    sd_power_gpregret_clr(POWER_GPREGRET_GPREGRET_Msk); 
sd_power_gpregret_set(BOOTLOADER_DFU_START); 
sd_softdevice_disable(); 
interrupts_disable(); 
sd_softdevice_vector_table_base_set(NRF_UICR->BOOTLOADERADDR); 
bootloader_util_app_start(NRF_UICR->BOOTLOADERADDR);

}

and it's OK , but when i use NVIC_SystemReset(); instead of bootloader_util_app_start it dosen't work and the bootloader dosen't start. although i added in the script of the bootloader to enter the bootloader program if GPREGRET=BOOTLOADERADDR or GPREGRET=0x00 ( case of a reset is handled )

this the modfication in the bootloader code :

if (dfu_start || (!bootloader_app_is_valid(DFU_BANK_0_REGION_START)) ||NRF_POWER->GPREGRET == 0x00)... this the condition part to enter dfu_mode , i just added the case where GPREGRET=0x00

Remarks:

1- the initialisation of the softdevice is always done in the case of a reset because we have :

-static bool dfu_start = false;

  • bool app_reset = (NRF_POWER->GPREGRET == BOOTLOADER_DFU_START);

  • ble_stack_init(!app_reset );

2- no button check is included , i commented that part as follow

//dfu_start |= ((nrf_gpio_pin_read(BOOTLOADER_BUTTON_PIN) == 0) ? true: false);

Questions :

  1. Why it dosen't work with the nvic reset ?
  2. can you explain to me the process of jump ..i have a small idea about assembly code but i don't know what are the registers used there when jumping...(thread mode .. )
  3. If i want to use Nvic_Reset() what should i do ? ( i don't care about the bonding service !! )
  4. This function ( __asm static void bootloader_util_reset(uint32_t start_addr) , used for the jump) is really confusing me !! in fact it's invoking a parameter that it never uses ..any explanation please
Parents
  • Hi Hung Bui Ok, good news, i did what you want me to do but with a different way. in fact i cancaled the check as fellow :

    //if (init_softdevice)

    //{
    
        err_code = sd_mbr_command(&com);
    
        APP_ERROR_CHECK(err_code);
    

    // }

    so here i'm sure that err_code = sd_mbr_command(&com) is called. I did a soft reset from the app and it's working very well. The hard reset is working well also ( if it's generated while the bootloader or the app is running the chip jumps to the bootloader program ).

    As i understand here, that the problem as you have said, is because err_code = sd_mbr_command(&com) was not really called .. So logically the only reason that when i added ble_stack_init(!app_reset ||NRF_POWER->GPREGRET ==0) it didn't work is that NRF_POWER->GPREGRET !=0 and app_reset =false (means NRF_POWER->GPREGRET == BOOTLOADER_DFU_START ) !! so how it works that after a soft reset the GPREGRET register dosen't change to 0x00 ? is that logic ?

    I want to know something else please, what's the difference between the soft and hard reset ( or chip reset ) ?

Reply
  • Hi Hung Bui Ok, good news, i did what you want me to do but with a different way. in fact i cancaled the check as fellow :

    //if (init_softdevice)

    //{
    
        err_code = sd_mbr_command(&com);
    
        APP_ERROR_CHECK(err_code);
    

    // }

    so here i'm sure that err_code = sd_mbr_command(&com) is called. I did a soft reset from the app and it's working very well. The hard reset is working well also ( if it's generated while the bootloader or the app is running the chip jumps to the bootloader program ).

    As i understand here, that the problem as you have said, is because err_code = sd_mbr_command(&com) was not really called .. So logically the only reason that when i added ble_stack_init(!app_reset ||NRF_POWER->GPREGRET ==0) it didn't work is that NRF_POWER->GPREGRET !=0 and app_reset =false (means NRF_POWER->GPREGRET == BOOTLOADER_DFU_START ) !! so how it works that after a soft reset the GPREGRET register dosen't change to 0x00 ? is that logic ?

    I want to know something else please, what's the difference between the soft and hard reset ( or chip reset ) ?

Children
No Data
Related