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 :
- Why it dosen't work with the nvic reset ?
- 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 .. )
- If i want to use Nvic_Reset() what should i do ? ( i don't care about the bonding service !! )
- 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