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

flashwrite persistence

Using sdk12.3 on pca10040.

I wanted to test persistence so I modified the example from the SDK as follows:  log what's already there.  don't erase.  enter new data.  log it again.

Using the provided example /peripheral/flashwrite to get the starting address

pg_size = NRF_FICR->CODEPAGESIZE;
pg_num = NRF_FICR->CODESIZE - 1; // Use last page in flash
addr = (uint32_t *)(pg_size * pg_num);

I then say:

flash_word_write(addr, (uint32_t)patwr);
NRF_LOG_INFO("'%c' was written to flash at %08x\r\n", patwr, (unsigned long) addr);
patrd = (uint8_t)*addr;
NRF_LOG_INFO("'%c' %08x was read from flash at %08x\r\n\r\n", patrd, *addr, (unsigned long) addr);

Regardless of the value of patwr (a character from the console) written to 0007F000 the read value is 00000000.

(So the fact that it does not persist across a reset is not surprising.)

Causes could be that the address is wrong or that writing to flash is somehow being blocked.

Any suggestions pls.

  • I used the code from the FDS document you suggested above.

    "You can check out the guide in or documentation on how to use the FDS module."

    In main()

    ..

    fds_record_t        record;

    ..

    BR. Paul

  • Check out the attached project.

    It is a project that uses the softdevice. I recommend that you start directly with this if you intend to use the softdevice in the end. Also because the fstorage_nosd.c is blank in SDK12.3.0. You can probably downport it from a newer SDK version, but if you intend to use the softdevice in the end anyway, I don't see any reason why to not use it from the start. 

    Note that this example is just initializing the fds. It doesn't write or read anything. It only initializes the FDS module.

    Note that I also added the lines:

    err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch);
    APP_ERROR_CHECK(err_code);

    in ble_stack_init() and the sys_evt_dispatch() in order to register the fstorage events.

    ble_app_uart_fds.zip

    Are you able to compile this using armgcc? I tested this makefile, and it worked here. If not, what version of armgcc do you use?

    Note that when you initialize, write or delete a record, wait for the corresponding events before you countinue.

    example:

    volatile bool m_init = false;
    volatile bool m_write = false;
    volatile bool m_delete = false;
    
    static void fds_evt_handler(fds_evt_t const * p_fds_evt)
    {
        switch(p_fds_evt->id)
        {
            case FDS_EVT_INIT:
                if(p_fds_evt->result != FDS_SUCCESS)
                {
                    // initialization failed.
                }
                else
                {
                    m_init = 1;
                }
                break;
                
            // Add the events for write and delete and set the corresponding m_write m_delete to true in these events.
            
            default:
                break;
        }
    }
    
    main()
    {
        ...
        //init all other things
        my_fds_init_function();
        while(!m_init){};
        
        my_fds_write_function();
        while(!m_fds_write){};
        m_fds_write = false;
        
        my_fds_delete_function();
        while(!m_delete){};
        m_delete = false;
        // Enter main loop.
        
        for (;;)
        {
            //if (NRF_LOG_PROCESS() == false)
            {
                power_manage();
            }
        }
    }

    BR,

    Edvin

Related