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

GPREG is not preserved after software reset

Hi!

I am developing anapplication on NRF52 DK. I need to preserve value between software resets and to do so i tried to use GPREG .

To set value i use code:

//set value

sd_power_gpregret_clr(0, 0xFF);
sd_power_gpregret_set(0, 0xAA);    

//check if value is set

uint32_t reg = 0;
sd_power_gpregret_get(0, &reg);    
NRF_LOG_INFO("REG %u", reg); //value is ok 0xAA

//reset
sd_nvic_SystemReset(); 

----------------------------------------------

After reset i check register:

uint32_t reg = 0;
sd_power_gpregret_get(0, &reg);    
NRF_LOG_INFO("REG %u", reg); //value is not ok 0x0

I always get 0 after reset.

Do i need some kind of initialization/configuration of this register? Is my code ok?

Thanks for the help!

  • Maybe you called the function before initializing the softdevice? I modified the ble_app_template example in SDK15 to show how to use gpregret.

    int main(void)
    {
        bool erase_bonds;
    
        // Initialize.
        log_init();
        timers_init();
        buttons_leds_init(&erase_bonds);
        power_management_init();
        ble_stack_init();
    
    
        NRF_LOG_INFO("\n\nStarting");
        uint32_t reset_reason;
        uint32_t reg = 0;
        sd_power_reset_reason_get(&reset_reason);
        if(reset_reason == 1){
            sd_power_reset_reason_clr(0x01);
            sd_power_gpregret_clr(0,0xff);
            sd_power_gpregret_set(0,0xaa);
            NRF_LOG_INFO("setting gpregret and reset");
            NRF_LOG_FLUSH();
            sd_nvic_SystemReset();
        }
    
        gap_params_init();
        gatt_init();
        advertising_init();
        services_init();
        conn_params_init();
        peer_manager_init();
    
        // Start execution.
        NRF_LOG_INFO("Template example started.");
        sd_power_gpregret_get(0,&reg);
        NRF_LOG_INFO("register 0x%x", reg);
        application_timers_start();
    
        advertising_start(erase_bonds);
    
        // Enter main loop.
        for (;;)
        {
            idle_state_handle();
        }
    }

  • FYI. Reset reason == 1 means pin reset. A power on reset will always become a pin reset if pin reset is enabled. This is default in the example I used. If you're not using pin reset, you can check for reset reason == 0, which is power on reset.

Related