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

Saving data to SD card every 5 sec (using app_timer)

Hi,
I'm using evaluation board nrf52 (nrf52832) and using SDK 13 (nRF5_SDK_13.0.0_04a0bfd) and programing it using eclipse. Here is the code:

/**

 * Copyright (c) 2016 - 2017, 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

 * @defgroup fatfs_example_main main.c

 * @{

 * @ingroup fatfs_example

 * @brief FATFS Example Application main file.

 *

 * This file contains the source code for a sample application using FAT filesystem and SD card library.

 *

 */



#include "app_timer.h"

#include "nrf.h"

#include "bsp.h"

#include "ff.h"

#include "diskio_blkdev.h"

#include "nrf_block_dev_sdc.h"



#define NRF_LOG_MODULE_NAME "APP"

#include "nrf_log.h"

#include "nrf_log_ctrl.h"





#define FILE_NAME   "NORDIC.TXT"

#define TEST_STRING "SD card example.\r\n"



#define SDC_SCK_PIN     ARDUINO_13_PIN  ///< SDC serial clock (SCK) pin.

#define SDC_MOSI_PIN    ARDUINO_11_PIN  ///< SDC serial data in (DI) pin.

#define SDC_MISO_PIN    ARDUINO_12_PIN  ///< SDC serial data out (DO) pin.

#define SDC_CS_PIN      ARDUINO_10_PIN  ///< SDC chip select (CS) pin.



//Timer

#define SD_SAVE_DATA_INTERVAL     APP_TIMER_TICKS(5000)                   /**< Tick / Ms */

APP_TIMER_DEF(sd_timer_id);



/**

 * @brief  SDC block device definition

 * */

NRF_BLOCK_DEV_SDC_DEFINE(

		m_block_dev_sdc,

		NRF_BLOCK_DEV_SDC_CONFIG(

				SDC_SECTOR_SIZE,

				APP_SDCARD_CONFIG(SDC_MOSI_PIN, SDC_MISO_PIN, SDC_SCK_PIN, SDC_CS_PIN)

		),

		NFR_BLOCK_DEV_INFO_CONFIG("Nordic", "SDC", "1.00")

);



/**

 * @brief Function for demonstrating FAFTS usage.

 */

static void fatfs_example()

{

	static uint32_t i;

	uint32_t id_sd = (i++);



	NRF_LOG_INFO("\r\n DO IT :%d \r\n\r\n",id_sd);

	static FATFS fs;

	static DIR dir;

	static FILINFO fno;

	static FIL file;



	uint32_t bytes_written;

	FRESULT ff_result;

	DSTATUS disk_state = STA_NOINIT;



	// Initialize FATFS disk I/O interface by providing the block device.

	static diskio_blkdev_t drives[] =

	{

			DISKIO_BLOCKDEV_CONFIG(NRF_BLOCKDEV_BASE_ADDR(m_block_dev_sdc, block_dev), NULL)

	};



	diskio_blockdev_register(drives, ARRAY_SIZE(drives));



	NRF_LOG_INFO("Initializing disk 0 (SDC)...\r\n");

	for (uint32_t retries = 3; retries && disk_state; --retries)

	{

		disk_state = disk_initialize(0);

	}

	if (disk_state)

	{

		NRF_LOG_INFO("Disk initialization failed.\r\n");

		return;

	}



	uint32_t blocks_per_mb = (1024uL * 1024uL) / m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_size;

	uint32_t capacity = m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_count / blocks_per_mb;

	NRF_LOG_INFO("Capacity: %d MB\r\n", capacity);



	NRF_LOG_INFO("Mounting volume...\r\n");

	ff_result = f_mount(&fs, "", 1);

	if (ff_result)

	{

		NRF_LOG_INFO("Mount failed.\r\n");

		return;

	}



	NRF_LOG_INFO("\r\n Listing directory: /\r\n");

	ff_result = f_opendir(&dir, "/");

	if (ff_result)

	{

		NRF_LOG_INFO("Directory listing failed!\r\n");

		return;

	}



	do

	{

		ff_result = f_readdir(&dir, &fno);

		if (ff_result != FR_OK)

		{

			NRF_LOG_INFO("Directory read failed.");

			return;

		}



		if (fno.fname[0])

		{

			if (fno.fattrib & AM_DIR)

			{

				NRF_LOG_RAW_INFO("   <DIR>   %s\r\n",(uint32_t)fno.fname);

			}

			else

			{

				NRF_LOG_RAW_INFO("%9lu  %s\r\n", fno.fsize, (uint32_t)fno.fname);

			}

		}

	}

	while (fno.fname[0]);

	NRF_LOG_RAW_INFO("\r\n");



	NRF_LOG_INFO("Writing to file " FILE_NAME "...\r\n");

	ff_result = f_open(&file, FILE_NAME, FA_READ | FA_WRITE | FA_OPEN_APPEND);

	if (ff_result != FR_OK)

	{

		NRF_LOG_INFO("Unable to open or create file: " FILE_NAME ".\r\n");

		return;

	}



	ff_result = f_write(&file, TEST_STRING, sizeof(TEST_STRING) - 1, (UINT *) &bytes_written);

	if (ff_result != FR_OK)

	{

		NRF_LOG_INFO("Write failed\r\n.");

	}

	else

	{

		NRF_LOG_INFO("%d bytes written.\r\n", bytes_written);

	}



	(void) f_close(&file);

	//bsp_board_led_invert(0);

	return;

}



// Timeout handler for the repeated timer

static void timer_sd_handler(void * p_context)

{

	NRF_LOG_INFO("\r\n Timer_SD_Handler.\r\n\r\n");



	UNUSED_PARAMETER(p_context);

	bsp_board_led_invert(0);

	fatfs_example();

}



// Create timers

static void timers_init()

{

	NRF_LOG_INFO("\r\n Timer_INIT.\r\n\r\n");

	ret_code_t err_code;



	// Initialize timer module.

	err_code = app_timer_init();

	APP_ERROR_CHECK(err_code);



/**	//    if(NRF_SUCCESS!=err_code){

	//    	NRF_LOG_INFO("Error while init. \r\n");

	//    }else {

	//    	NRF_LOG_INFO("App timer init. \r\n");

	//    }

**/

	// Create timers

	err_code = app_timer_create(&sd_timer_id,

			APP_TIMER_MODE_REPEATED,

			timer_sd_handler);



	NRF_LOG_INFO("\r\n Init and create timer.\r\n\r\n");



	APP_ERROR_CHECK(err_code);

	bsp_board_led_invert(0);



}





/**@brief Function for initializing the nrf log module.

 */

static void log_init(void)

{

	ret_code_t err_code = NRF_LOG_INIT(NULL);

	APP_ERROR_CHECK(err_code);

}





/**@brief Function for starting timers.

 */

static void application_timers_start(void)

{

	NRF_LOG_INFO("\r\n Timer_sd_start.\r\n\r\n");

	ret_code_t err_code;

	err_code = app_timer_start(sd_timer_id, SD_SAVE_DATA_INTERVAL, NULL);

	APP_ERROR_CHECK(err_code);



}





/**

 * @brief Function for main application entry.

 */

int main(void)

{

	bsp_board_leds_init();

	log_init();





	NRF_LOG_INFO("\r\nFATFS.\r\n\r\n");



	// Init timers.

	timers_init();



	// Timers starts

	application_timers_start();



	while (true)

	{

		__WFI();

	}

}



/** @} */

Someting is not working and i'm not sure but in my opinion app_timer is not working correct. Log : 

APP:INFO:
FATFS.

APP:INFO:
 Timer_INIT.

APP:INFO:
 Init and create timer.

APP:INFO:
 Timer_sd_start.

After init timer and start it the timer_sd_handler() is not calling and i don't know why. Does anyone has any idea? 

Parents
  • Hi,

    app_timer does not start up the LFCLK source. Try starting up the LFCLK, then start the app_timer instance.

    Cheers,

    Håkon

  • It helps, i add 

    // Init for LFCLK
    static void lfclk_request(void)
    {
        ret_code_t err_code = nrf_drv_clock_init();
        APP_ERROR_CHECK(err_code);
        nrf_drv_clock_lfclk_request(NULL);
    
        if(nrf_drv_clock_lfclk_is_running()){
    		NRF_LOG_INFO("LFCLK: ON \r\n ");
    	}
    }


    and in main 

    	// Request LF clock.
    	    lfclk_request();
    
    

    later i must add this in sdk_config.h file 

    // </e>
    
    // <e> CLOCK_ENABLED - nrf_drv_clock - CLOCK peripheral driver
    //==========================================================
    #ifndef CLOCK_ENABLED
    #define CLOCK_ENABLED 1
    #endif
    #if  CLOCK_ENABLED
    // <o> CLOCK_CONFIG_XTAL_FREQ  - HF XTAL Frequency
    
    // <0=> Default (64 MHz)
    
    #ifndef CLOCK_CONFIG_XTAL_FREQ
    #define CLOCK_CONFIG_XTAL_FREQ 0
    #endif
    
    // <o> CLOCK_CONFIG_LF_SRC  - LF Clock Source
    
    // <0=> RC
    // <1=> XTAL
    // <2=> Synth
    
    #ifndef CLOCK_CONFIG_LF_SRC
    #define CLOCK_CONFIG_LF_SRC 1
    #endif
    
    // <o> CLOCK_CONFIG_IRQ_PRIORITY  - Interrupt priority
    
    
    // <i> Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
    // <0=> 0 (highest)
    // <1=> 1
    // <2=> 2
    // <3=> 3
    // <4=> 4
    // <5=> 5
    // <6=> 6
    // <7=> 7
    
    #ifndef CLOCK_CONFIG_IRQ_PRIORITY
    #define CLOCK_CONFIG_IRQ_PRIORITY 7
    #endif
    
    // <e> CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module.
    //==========================================================
    #ifndef CLOCK_CONFIG_LOG_ENABLED
    #define CLOCK_CONFIG_LOG_ENABLED 1
    #endif
    #if  CLOCK_CONFIG_LOG_ENABLED
    // <o> CLOCK_CONFIG_LOG_LEVEL  - Default Severity level
    
    // <0=> Off
    // <1=> Error
    // <2=> Warning
    // <3=> Info
    // <4=> Debug
    
    #ifndef CLOCK_CONFIG_LOG_LEVEL
    #define CLOCK_CONFIG_LOG_LEVEL 3
    #endif
    
    // <o> CLOCK_CONFIG_INFO_COLOR  - ANSI escape code prefix.
    
    // <0=> Default
    // <1=> Black
    // <2=> Red
    // <3=> Green
    // <4=> Yellow
    // <5=> Blue
    // <6=> Magenta
    // <7=> Cyan
    // <8=> White
    
    #ifndef CLOCK_CONFIG_INFO_COLOR
    #define CLOCK_CONFIG_INFO_COLOR 0
    #endif
    
    // <o> CLOCK_CONFIG_DEBUG_COLOR  - ANSI escape code prefix.
    
    // <0=> Default
    // <1=> Black
    // <2=> Red
    // <3=> Green
    // <4=> Yellow
    // <5=> Blue
    // <6=> Magenta
    // <7=> Cyan
    // <8=> White
    
    #ifndef CLOCK_CONFIG_DEBUG_COLOR
    #define CLOCK_CONFIG_DEBUG_COLOR 0
    #endif
    
    #endif //CLOCK_CONFIG_LOG_ENABLED
    // </e>
    
    #endif //CLOCK_ENABLED

    but when i compile it, something stop the program and this is the finall log 

    Process: JLinkGDBServer
    APP:INFO:
    FATFS.
    
    CLOCK:INFO:Function: nrf_drv_clock_init, error code: NRF_SUCCESS.
    APP:INFO:
     Timer_INIT.
    
    APP:INFO:
     Init and create timer.
    
    APP:INFO:
     Timer_sd_start.
    
    APP:INFO:Timer was successfully started. 
    APP:INFO:
     Timer_SD_Handler.
    
    APP:INFO:
     DO IT :0 
    
    APP:INFO:Initializing disk 0 (SDC)...
    

    and when i check SD card nothing is save on it. 
    Thanks for help, but now i need to solve other problem.

Reply
  • It helps, i add 

    // Init for LFCLK
    static void lfclk_request(void)
    {
        ret_code_t err_code = nrf_drv_clock_init();
        APP_ERROR_CHECK(err_code);
        nrf_drv_clock_lfclk_request(NULL);
    
        if(nrf_drv_clock_lfclk_is_running()){
    		NRF_LOG_INFO("LFCLK: ON \r\n ");
    	}
    }


    and in main 

    	// Request LF clock.
    	    lfclk_request();
    
    

    later i must add this in sdk_config.h file 

    // </e>
    
    // <e> CLOCK_ENABLED - nrf_drv_clock - CLOCK peripheral driver
    //==========================================================
    #ifndef CLOCK_ENABLED
    #define CLOCK_ENABLED 1
    #endif
    #if  CLOCK_ENABLED
    // <o> CLOCK_CONFIG_XTAL_FREQ  - HF XTAL Frequency
    
    // <0=> Default (64 MHz)
    
    #ifndef CLOCK_CONFIG_XTAL_FREQ
    #define CLOCK_CONFIG_XTAL_FREQ 0
    #endif
    
    // <o> CLOCK_CONFIG_LF_SRC  - LF Clock Source
    
    // <0=> RC
    // <1=> XTAL
    // <2=> Synth
    
    #ifndef CLOCK_CONFIG_LF_SRC
    #define CLOCK_CONFIG_LF_SRC 1
    #endif
    
    // <o> CLOCK_CONFIG_IRQ_PRIORITY  - Interrupt priority
    
    
    // <i> Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
    // <0=> 0 (highest)
    // <1=> 1
    // <2=> 2
    // <3=> 3
    // <4=> 4
    // <5=> 5
    // <6=> 6
    // <7=> 7
    
    #ifndef CLOCK_CONFIG_IRQ_PRIORITY
    #define CLOCK_CONFIG_IRQ_PRIORITY 7
    #endif
    
    // <e> CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module.
    //==========================================================
    #ifndef CLOCK_CONFIG_LOG_ENABLED
    #define CLOCK_CONFIG_LOG_ENABLED 1
    #endif
    #if  CLOCK_CONFIG_LOG_ENABLED
    // <o> CLOCK_CONFIG_LOG_LEVEL  - Default Severity level
    
    // <0=> Off
    // <1=> Error
    // <2=> Warning
    // <3=> Info
    // <4=> Debug
    
    #ifndef CLOCK_CONFIG_LOG_LEVEL
    #define CLOCK_CONFIG_LOG_LEVEL 3
    #endif
    
    // <o> CLOCK_CONFIG_INFO_COLOR  - ANSI escape code prefix.
    
    // <0=> Default
    // <1=> Black
    // <2=> Red
    // <3=> Green
    // <4=> Yellow
    // <5=> Blue
    // <6=> Magenta
    // <7=> Cyan
    // <8=> White
    
    #ifndef CLOCK_CONFIG_INFO_COLOR
    #define CLOCK_CONFIG_INFO_COLOR 0
    #endif
    
    // <o> CLOCK_CONFIG_DEBUG_COLOR  - ANSI escape code prefix.
    
    // <0=> Default
    // <1=> Black
    // <2=> Red
    // <3=> Green
    // <4=> Yellow
    // <5=> Blue
    // <6=> Magenta
    // <7=> Cyan
    // <8=> White
    
    #ifndef CLOCK_CONFIG_DEBUG_COLOR
    #define CLOCK_CONFIG_DEBUG_COLOR 0
    #endif
    
    #endif //CLOCK_CONFIG_LOG_ENABLED
    // </e>
    
    #endif //CLOCK_ENABLED

    but when i compile it, something stop the program and this is the finall log 

    Process: JLinkGDBServer
    APP:INFO:
    FATFS.
    
    CLOCK:INFO:Function: nrf_drv_clock_init, error code: NRF_SUCCESS.
    APP:INFO:
     Timer_INIT.
    
    APP:INFO:
     Init and create timer.
    
    APP:INFO:
     Timer_sd_start.
    
    APP:INFO:Timer was successfully started. 
    APP:INFO:
     Timer_SD_Handler.
    
    APP:INFO:
     DO IT :0 
    
    APP:INFO:Initializing disk 0 (SDC)...
    

    and when i check SD card nothing is save on it. 
    Thanks for help, but now i need to solve other problem.

Children
No Data
Related