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.

Parents
  • Sorry, something I did not try was to re-instate the call to flash_page_erase(addr);

    That makes the sketch work but of course this prevents it from persisting across a reset.

  • Hello,

    The flash works in the way that you can only flip bits from 1 to 0. In order to flip them back to 1, you need to delete the entire flash page, unfortunately. This means that you need to somehow work around this, by figuring out where your latest data is written. 

    One way to work around this is to use the FDS module, which stores records with record IDs, which you can use to update a record, delete records, or write new records. 

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

    So there you would typically use functions like fds_record_write(), fds_record_delete(), fds_record_update(), and so on. The FDS module will also evenly distribute the flash tear, so it will ensure maximum durance for the flash.

    Best regards,

    Edvin

  • Hello Paul,

    Yes. This is possible in SDK12.3.0

    fds_record_t is defined in fds.h, so you must add the folder including this in your INC_FOLDERS in your makefile.

    $(SDK_ROOT)/components/libraries/fds \

    I see that you have included it in your makefile, but there must be something wrong with it. 

    Do you intend to use the softdevice in your final appliaction?

    Can you please paste the compiler output log?

    BR,

    Edvin

  • Thx Edvin,

    Initially without softdevice.  Will add that later.

    Compiling file: main.c

    ../../../main.c: In function 'main':

    ../../../main.c:100:13: error: 'struct <anonymous>' has no member named 'p_data'

      record.data.p_data       = &m_deadbeef;

                 ^

    ../../../main.c:101:13: error: 'struct <anonymous>' has no member named 'length_words'

      record.data.length_words = 1;   /* one word is four bytes. */

                 ^

    ../../../main.c:110:13: error: 'struct <anonymous>' has no member named 'p_data'

      record.data.p_data       = &m_hello;

                 ^

    ../../../main.c:112:13: error: 'struct <anonymous>' has no member named 'length_words'

      record.data.length_words = (sizeof(m_hello) + 3) / 4;

                 ^

    make: *** [_build/nrf52832_xxaa_main.c.o] Error 1

     

    I may have misinterpreted the above?

    Thx. Paul

  • Where do you declare "record"? and what does it look like?

  • 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

Reply
  • 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

Children
No Data
Related