SDK11, NRF51822
#include "fstorage.h"
#include "section_vars.h"
#define NUM_PAGES 6
static uint8_t fs_callback_flag;
static void fs_evt_handler(fs_evt_t const * const evt, fs_ret_t result)
{
if (result != FS_SUCCESS)
{
//bsp_indication_set(BSP_INDICATE_FATAL_ERROR);
}
else
{
NRF_LOG_PRINTF(" fstorage command successfully completed \n\r");
fs_callback_flag = 0;
}
}
FS_REGISTER_CFG(fs_config_t fs_config) =
{
.callback = fs_evt_handler, // Function for event callbacks.
.num_pages = NUM_PAGES, // Number of physical flash pages required.
.priority = 0xFE // Priority for flash usage.
};
void init_fstorage(void)
{
fs_ret_t ret = fs_init();
if (ret != FS_SUCCESS)
{
//bsp_indication_set(BSP_INDICATE_FATAL_ERROR);
NRF_LOG_PRINTF("FS init failed!\n");
}
else
{
NRF_LOG_PRINTF("FS init ok!\n");
}
}
//----------------------------
void feed_wdt(void)
{
uint32_t err_code = sd_app_evt_wait();
APP_ERROR_CHECK(err_code);
}
//-----------------------------
void fstorage_test(void)
{
static uint32_t data;
uint32_t flash_data[4];
fs_ret_t ret;
// Erase one page (page 0).
NRF_LOG_PRINTF("Erasing a flash page at address 0x%X\r\n", (uint32_t)fs_config.p_start_addr);
fs_callback_flag = 1;
ret = fs_erase(&fs_config, fs_config.p_start_addr, 1);
while(fs_callback_flag == 1) { feed_wdt(); }
//ret = fs_erase(&fs_config, fs_config.p_start_addr+1024, 1);
//while(fs_callback_flag == 1) { power_manage(); }
//Read the first 4 words of the page
NRF_LOG_PRINTF("Data read from flash address 0x%X: ", (uint32_t)fs_config.p_start_addr);
for(int i=0; i<4; i++)
{
flash_data[i] = *(fs_config.p_start_addr + i);
NRF_LOG_PRINTF("%X ", flash_data[i]);
}
NRF_LOG_PRINTF("\r\n");
data = 0xAAAAAAAA;
NRF_LOG_PRINTF("Writing data 0x%X to address 0x%X\r\n", data, (uint32_t)fs_config.p_start_addr);
fs_callback_flag = 1;
ret = fs_store(&fs_config, fs_config.p_start_addr, &data, 1); //Write data to memory address 0x0003F00. Check it with command: nrfjprog --memrd 0x0003F000 --n 16
if (ret != FS_SUCCESS)
{
//bsp_indication_set(BSP_INDICATE_FATAL_ERROR);
}
while(fs_callback_flag == 1) {feed_wdt(); }
data = 0xBBBBBBBB;
NRF_LOG_PRINTF("Writing data 0x%X to address 0x%X\r\n", data, (uint32_t)fs_config.p_start_addr + 4);
fs_callback_flag = 1;
ret = fs_store(&fs_config, fs_config.p_start_addr + 1, &data, 1); //Write data to memory address 0x0003F000. Check it with command: nrfjprog --memrd 0x0003F000 --n 16
if (ret != FS_SUCCESS)
{
//bsp_indication_set(BSP_INDICATE_FATAL_ERROR);
}
while(fs_callback_flag == 1) { feed_wdt(); }
data = 0xCCCCCCCC;
NRF_LOG_PRINTF("Writing data 0x%X to address 0x%X\r\n", data, (uint32_t)fs_config.p_start_addr + 8);
fs_callback_flag = 1;
ret = fs_store(&fs_config, fs_config.p_start_addr + 2, &data, 1); //Write data to memory address 0x0003F000. Check it with command: nrfjprog --memrd 0x0003F000 --n 16
if (ret != FS_SUCCESS)
{
//bsp_indication_set(BSP_INDICATE_FATAL_ERROR);
}
while(fs_callback_flag == 1) {feed_wdt(); }
//Read the first 4 words of the page
NRF_LOG_PRINTF("Data read from flash address 0x%X: ", (uint32_t)fs_config.p_start_addr);
for(int i=0; i<4; i++)
{
flash_data[i] = *(fs_config.p_start_addr + i);
NRF_LOG_PRINTF("%X ", flash_data[i]);
}
NRF_LOG_PRINTF("\r\n");
//================================================
// Erase one page (page 0).
NRF_LOG_PRINTF("Erasing a flash page at address 0x%X\r\n", (uint32_t)fs_config.p_start_addr);
fs_callback_flag = 1;
ret = fs_erase(&fs_config, fs_config.p_start_addr+0x100, 1);
while(fs_callback_flag == 1) { feed_wdt();}
//ret = fs_erase(&fs_config, fs_config.p_start_addr+1024, 1);
//while(fs_callback_flag == 1) { power_manage(); }
//Read the first 4 words of the page
NRF_LOG_PRINTF("Data read from flash address 0x%X: ", (uint32_t)fs_config.p_start_addr+0x100);
for(int i=0; i<4; i++)
{
flash_data[i] = *(fs_config.p_start_addr +0x100+ i);
NRF_LOG_PRINTF("%X ", flash_data[i]);
}
NRF_LOG_PRINTF("\r\n");
data = 0xAAAAAAAA;
NRF_LOG_PRINTF("Writing data 0x%X to address 0x%X\r\n", data, (uint32_t)fs_config.p_start_addr+0x100);
fs_callback_flag = 1;
ret = fs_store(&fs_config, fs_config.p_start_addr+0x100, &data, 1); //Write data to memory address 0x0003F00. Check it with command: nrfjprog --memrd 0x0003F000 --n 16
if (ret != FS_SUCCESS)
{
//bsp_indication_set(BSP_INDICATE_FATAL_ERROR);
}
while(fs_callback_flag == 1) {feed_wdt(); }
NRF_LOG_PRINTF("Data read from flash address 0x%X: ", (uint32_t)fs_config.p_start_addr+0x100);
for(int i=0; i<4; i++)
{
flash_data[i] = *(fs_config.p_start_addr+0x100 + i);
NRF_LOG_PRINTF("%X ", flash_data[i]);
}
NRF_LOG_PRINTF("\r\n");
}
void sys_evt_dispatch(uint32_t sys_evt) //
{
//pstorage_sys_event_handler(sys_evt);
fs_sys_event_handler(sys_evt);
ble_advertising_on_sys_evt(sys_evt);
}
static void ble_stack_init(void)
{
uint32_t err_code;
nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;
// Initialize SoftDevice.
SOFTDEVICE_HANDLER_INIT(&clock_lf_cfg, NULL);
ble_enable_params_t ble_enable_params;
err_code = softdevice_enable_get_default_config(CENTRAL_LINK_COUNT,
PERIPHERAL_LINK_COUNT,
&ble_enable_params);
APP_ERROR_CHECK(err_code);
//Check the ram settings against the used number of links
CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT);
// Enable BLE stack.
err_code = softdevice_enable(&ble_enable_params);
APP_ERROR_CHECK(err_code);
// Subscribe for BLE events.
err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);
APP_ERROR_CHECK(err_code);
// Register with the SoftDevice handler module for BLE events.
err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch);
APP_ERROR_CHECK(err_code);
}
//-------------------------------------------
void application_init(void)
{
uint32_t err_code;
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
system_gpios_init();
dx_ble_app_init();
app_pwms_init();
err_code = param_data_init();
APP_ERROR_CHECK(err_code);
battery_check_init();
button_check_init();
wdt_init();
init_fstorage();
//fstorage_test(); //here run OK
err_code = app_timer_create(&m_app_assist_timer_id,
APP_TIMER_MODE_REPEATED,
app_assist_meas_timeout_handler);
APP_ERROR_CHECK(err_code);
}
//-------------------------------------------
int main(void)
{
NRF_LOG_INIT();
application_init();
NRF_LOG_PRINTF("system start......\r\n");
// Enter main loop.
for (;;)
{
power_manage();
}
}
if I use the fstorage_test at the applicaiton_init(void), then runs ok.
but on my product, I use a key to power the system, if I use the fstorage_test() in the power on function(), then the fs_sys_event_handler() can't be called, code as following:
static void power_key_long_press_proc(void)
{
NRF_LOG_PRINTF("power on\r\n");
app_timer_start(m_app_assist_timer_id, APP_ASSIST_MEAS_INTERVAL, NULL);
fstorage_test(); // if at here, the function run failed.
get_toy_ble_mac(app_system_param.dec_addr);
POWER_ON(POWER_MASK);
ble_advertising_start(BLE_ADV_MODE_FAST);
}
static void bottun_event_handler(void * p_context)
{
//some code here...
if(long_press == 1)
{
power_key_long_press_proc();
}
}
Can someone help me?