This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Jumping to Bootloader from the Application

How can I jump to the bootloader from the application without anything BLE related. Possibly through a botton?

I'm on the newest SDK v11.

  • Many ways. You could just make the button reset the system and then have that button be the same one which triggers the bootloader to enter DFU mode, press the button and hold it for long enough the bootloader sees it, that doesn't even require any code change in the loader.

    I added a few lines of code to the start of the bootloader to force it into DFU mode if a given value is written to GPREGRET. That works too, I have a standard control service which uses BLE to receive an enter DFU command, writes GPREGRET and resets, then it goes into DFU mode. I found this preferable to the method in the manual which bounces between the two, it's clever, but more than I needed. This way I can quite easily force myself into bootloader mode with either a button or a command over my BLE command channel.

  • In order to jump to the bootloader , you have to add this define in your application project

    #define BOOTLOADER_DFU_START 0xB1
    

    and call the following functions when the button is pressed:

    if (button_is_pressed)
    
    {
        //  Write to the the GPREGRET REGISTER and reset the chip
    
       //You can use the sd_-functions 
    
        err_code = sd_power_gpregret_set(BOOTLOADER_DFU_START);
    
        APP_ERROR_CHECK(err_code);
    
        sd_nvic_SystemReset();   
    
    
       //OR set the register directly and then call NVIC_SystemReset(); 
    
        NRF_POWER->GPREGRET = BOOTLOADER_DFU_START;
    
        NVIC_SystemReset();
    }
    

    In the bootloader you have to remove the init_softdevice check in ble_stack_init(), i.e.

    //if (init_softdevice)
    
    //{
        err_code = sd_mbr_command(&com);
    
        APP_ERROR_CHECK(err_code);
    //}
    

    -Bjørn

  • Are there any restrictions on how many times you can read/write to this register? Or what you set it as? After setting it does it always have to be followed by a reset? What if you want to communicate different reasons why a reset occurred using this register? Can you set it to values of your choice?

  • Is there documentation on how to use the GPREGRET register?

  • No, you can write to the GPREGRET (General purpose retention register) at any time and set it to any value. No, writing to the GPREGRET register does not have to be followed by a reset. Since the register is retained during a reset, you can set it to a certain value indicating the reason for the reset and then check it after the device has reset. We do not have any documentation on how to use GPREGRET register.

Related