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

SDK example flash_storage.

Hi ,

I have been tryiing out the flash_storage example  in the SDK /examples/pheripherals/flash_storage . The flash storage , permits us to write hello world to any memory location, however if i define another static char temp_data [] = " test data to be stored" . If i use the variable temp_data to store to a specific memory it throws into error statement upon execution. Could you help me out. 

 rc = nrf_fstorage_write(&fstorage, 0x3f000, m_hello_world, sizeof(m_hello_world), NULL); if I change it with 

 rc = nrf_fstorage_write(&fstorage, 0x3f000, temp_data, sizeof(temp_data), NULL);  // This condition falls to error upon execution. 

Thanks,

Parents Reply Children
  • Hi, 

    I have attached the code, kindly check it. 

    /**
     * Copyright (c) 2016 - 2020, Nordic Semiconductor ASA
     *
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted provided that the following conditions are met:
     *
     * 1. Redistributions of source code must retain the above copyright notice, this
     *    list of conditions and the following disclaimer.
     *
     * 2. Redistributions in binary form, except as embedded into a Nordic
     *    Semiconductor ASA integrated circuit in a product or a software update for
     *    such product, must reproduce the above copyright notice, this list of
     *    conditions and the following disclaimer in the documentation and/or other
     *    materials provided with the distribution.
     *
     * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
     *    contributors may be used to endorse or promote products derived from this
     *    software without specific prior written permission.
     *
     * 4. This software, with or without modification, must only be used with a
     *    Nordic Semiconductor ASA integrated circuit.
     *
     * 5. Any software provided in binary form under this license must not be reverse
     *    engineered, decompiled, modified and/or disassembled.
     *
     * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     */
    
    /** @file
     *
     * @brief fstorage example main file.
     *
     * This example showcases fstorage usage.
     */
    
    #include <stdint.h>
    #include <stdbool.h>
    #include <string.h>
    
    #include "nrf.h"
    #include "nrf_soc.h"
    #include "nordic_common.h"
    #include "boards.h"
    #include "app_timer.h"
    #include "app_util.h"
    #include "nrf_fstorage.h"
    
    #ifdef SOFTDEVICE_PRESENT
    #include "nrf_sdh.h"
    #include "nrf_sdh_ble.h"
    #include "nrf_fstorage_sd.h"
    #else
    #include "nrf_drv_clock.h"
    #include "nrf_fstorage_nvmc.h"
    #endif
    
    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    //.#include "nrf_log_default_backends.h"
    
    
    #define BUTTON_DETECTION_DELAY  APP_TIMER_TICKS(50)
    #define APP_BLE_CONN_CFG_TAG    1
    char dummy_data[20];
    
    /* Defined in cli.c */
    extern void cli_init(void);
    extern void cli_start(void);
    extern void cli_process(void);
    
    static void fstorage_evt_handler(nrf_fstorage_evt_t * p_evt);
    
    
    NRF_FSTORAGE_DEF(nrf_fstorage_t fstorage) =
    {
        /* Set a handler for fstorage events. */
        .evt_handler = fstorage_evt_handler,
    
        /* These below are the boundaries of the flash space assigned to this instance of fstorage.
         * You must set these manually, even at runtime, before nrf_fstorage_init() is called.
         * The function nrf5_flash_end_addr_get() can be used to retrieve the last address on the
         * last page of flash available to write data. */
        .start_addr = 0x3e000,
        .end_addr   = 0x3ffff,
    };
    
    /* Dummy data to write to flash. */
    static uint32_t m_data          = 0xBADC0FFE;
     char     m_hello_world[] = "TESTCONDITION";
     char m_hello_world_[] = "test";
    
    
    /**@brief   Helper function to obtain the last address on the last page of the on-chip flash that
     *          can be used to write user data.
     */
    static uint32_t nrf5_flash_end_addr_get()
    {
        uint32_t const bootloader_addr = BOOTLOADER_ADDRESS;
        uint32_t const page_sz         = NRF_FICR->CODEPAGESIZE;
        uint32_t const code_sz         = NRF_FICR->CODESIZE;
    
        return (bootloader_addr != 0xFFFFFFFF ?
                bootloader_addr : (code_sz * page_sz));
    }
    
    
    #ifdef SOFTDEVICE_PRESENT
    /**@brief   Function for initializing the SoftDevice and enabling the BLE stack. */
    static void ble_stack_init(void)
    {
        ret_code_t rc;
        uint32_t   ram_start;
    
        /* Enable the SoftDevice. */
        rc = nrf_sdh_enable_request();
        APP_ERROR_CHECK(rc);
    
        rc = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
        APP_ERROR_CHECK(rc);
    
        rc = nrf_sdh_ble_enable(&ram_start);
        APP_ERROR_CHECK(rc);
    }
    #else
    static void clock_init(void)
    {
        /* Initialize the clock. */
        ret_code_t rc = nrf_drv_clock_init();
        APP_ERROR_CHECK(rc);
    
        nrf_drv_clock_lfclk_request(NULL);
    
        // Wait for the clock to be ready.
        while (!nrf_clock_lf_is_running()) {;}
    }
    #endif
    
    
    /**@brief   Initialize the timer. */
    static void timer_init(void)
    {
        ret_code_t err_code = app_timer_init();
        APP_ERROR_CHECK(err_code);
    }
    
    
    /**@brief   Sleep until an event is received. */
    static void power_manage(void)
    {
    #ifdef SOFTDEVICE_PRESENT
        (void) sd_app_evt_wait();
    #else
        __WFE();
    #endif
    }
    
    
    static void fstorage_evt_handler(nrf_fstorage_evt_t * p_evt)
    {
        if (p_evt->result != NRF_SUCCESS)
        {
            NRF_LOG_INFO("--> Event received: ERROR while executing an fstorage operation.");
            return;
        }
    
        switch (p_evt->id)
        {
            case NRF_FSTORAGE_EVT_WRITE_RESULT:
            {
                NRF_LOG_INFO("--> Event received: wrote %d bytes at address 0x%x.",
                             p_evt->len, p_evt->addr);
            } break;
    
            case NRF_FSTORAGE_EVT_ERASE_RESULT:
            {
                NRF_LOG_INFO("--> Event received: erased %d page from address 0x%x.",
                             p_evt->len, p_evt->addr);
            } break;
    
            default:
                break;
        }
    }
    
    
    static void print_flash_info(nrf_fstorage_t * p_fstorage)
    {
        NRF_LOG_INFO("========| flash info |========");
        NRF_LOG_INFO("erase unit: \t%d bytes",      p_fstorage->p_flash_info->erase_unit);
        NRF_LOG_INFO("program unit: \t%d bytes",    p_fstorage->p_flash_info->program_unit);
        NRF_LOG_INFO("==============================");
    }
    
    
    void wait_for_flash_ready(nrf_fstorage_t const * p_fstorage)
    {
        /* While fstorage is busy, sleep and wait for an event. */
        while (nrf_fstorage_is_busy(p_fstorage))
        {
            power_manage();
        }
    }
    
    
    static void log_init(void)
    {
        ret_code_t rc = NRF_LOG_INIT(NULL);
        APP_ERROR_CHECK(rc);
    }
    
    
    int main(void)
    {
        ret_code_t rc;
    
    #ifndef SOFTDEVICE_PRESENT
        clock_init();
    #endif
    
        timer_init();
        log_init();
        cli_init();
        printf("INITIALIZATION");
        NRF_LOG_INFO("fstorage example started.");
    
        nrf_fstorage_api_t * p_fs_api;
    
    #ifdef SOFTDEVICE_PRESENT
        NRF_LOG_INFO("SoftDevice is present.");
        NRF_LOG_INFO("Initializing nrf_fstorage_sd implementation...");
        /* Initialize an fstorage instance using the nrf_fstorage_sd backend.
         * nrf_fstorage_sd uses the SoftDevice to write to flash. This implementation can safely be
         * used whenever there is a SoftDevice, regardless of its status (enabled/disabled). */
        p_fs_api = &nrf_fstorage_sd;
    #else
        NRF_LOG_INFO("SoftDevice not present.");
        NRF_LOG_INFO("Initializing nrf_fstorage_nvmc implementation...");
        /* Initialize an fstorage instance using the nrf_fstorage_nvmc backend.
         * nrf_fstorage_nvmc uses the NVMC peripheral. This implementation can be used when the
         * SoftDevice is disabled or not present.
         *
         * Using this implementation when the SoftDevice is enabled results in a hardfault. */
        p_fs_api = &nrf_fstorage_nvmc;
    #endif
    
        rc = nrf_fstorage_init(&fstorage, p_fs_api, NULL);
        APP_ERROR_CHECK(rc);
    
        print_flash_info(&fstorage);
    
        /* It is possible to set the start and end addresses of an fstorage instance at runtime.
         * They can be set multiple times, should it be needed. The helper function below can
         * be used to determine the last address on the last page of flash memory available to
         * store data. */
        (void) nrf5_flash_end_addr_get();
        //rc = nrf_fstorage_erase(&fstorage,0x3F000);
        /* Let's write to flash. */
        NRF_LOG_INFO("Writing \"%x\" to flash.", m_data);
        rc = nrf_fstorage_write(&fstorage, 0x3e000, &m_data, sizeof(m_data), NULL);
        APP_ERROR_CHECK(rc);
    
        wait_for_flash_ready(&fstorage);
        NRF_LOG_INFO("Done.");
    
    #ifdef SOFTDEVICE_PRESENT
        /* Enable the SoftDevice and the BLE stack. */
        NRF_LOG_INFO("Enabling the SoftDevice.");
        ble_stack_init();
    
        m_data = 0xDEADBEEF;
    
        NRF_LOG_INFO("Writing \"%x\" to flash.", m_data);
        rc = nrf_fstorage_write(&fstorage, 0x3e100, &m_data, sizeof(m_data), NULL);
        APP_ERROR_CHECK(rc);
    
        wait_for_flash_ready(&fstorage);
        NRF_LOG_INFO("Done.");
    #endif
    
        NRF_LOG_INFO("Writing \"%s\" to flash.", m_hello_world);
        rc = nrf_fstorage_write(&fstorage, 0x3f000, m_hello_world, sizeof(m_hello_world), NULL);
        APP_ERROR_CHECK(rc);
        printf("NRF_STORAGE_ATTEMPT_3");
        wait_for_flash_ready(&fstorage);
        NRF_LOG_INFO("Done.");
        // This is where the new variable is being stored
        rc = nrf_fstorage_write(&fstorage, 0x3f100, m_hello_world_, sizeof(m_hello_world_), NULL);
        printf("NRF_STORAGE_ATTEMPT_4");
        APP_ERROR_CHECK(rc);
        wait_for_flash_ready(&fstorage);
        printf("DONE");
        
        rc = nrf_fstorage_read(&fstorage, 0x3f100, &dummy_data,13);    
          printf("reading previously written_data");
          for(int i = 0; i < 13; i ++){
            printf("%c",*(dummy_data + i));
    
            }
       APP_ERROR_CHECK(rc);
        NRF_LOG_INFO("Use 'read' to read bytes from the flash.");
        NRF_LOG_INFO("Use 'write' to write bytes to the flash.");
        NRF_LOG_INFO("Use 'erase' to erase flash pages.");
        NRF_LOG_INFO("Use 'flasharea' to print and configure the flash read boundaries.");
    
        cli_start();
    
        /* Enter main loop. */
        for (;;)
        {
            if (!NRF_LOG_PROCESS())
            {
                power_manage();
            }
            cli_process();
        }
    }
    
    
    /**
     * @}
     */
    

  • Hi again, sorry for the late reply

    Which SDK version are you using? It seems that you have changed a lot more than just the data to be stored.

    Does the code you posted work if you just change the data back to m_hello_world ?

Related