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

Example for getting and setting rtc time using app using nrf52832

Hello,

I have just started learning nrf. I have an nrf52832 board and I want to get and set time using app.

I have seen this https://devzone.nordicsemi.com/f/nordic-q-a/57827/nrf5-calendar-example-questions

but haven't got much.

Please suggest me some examples.

Thank you in advance

  • Hi I have solved the COM port error, now the main problem is 

    RTC is not giving any value in the Terminal

    #include "nrf_calendar.h"
    #include "nrf.h"
    
     
    static struct tm time_struct, m_tm_return_time; 
    static time_t m_time, m_last_calibrate_time = 0;
    static float m_calibrate_factor = 1.0f;
    static uint32_t m_rtc_increment = 1;
    static void (*cal_event_callback)(void) = 0;
    
    
    
    
    
     
    void nrf_cal_init(void)
    {
        NRF_CLOCK->LFCLKSRC = CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos;
        NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
        NRF_CLOCK->TASKS_LFCLKSTART = 1;
        while(NRF_CLOCK->EVENTS_LFCLKSTARTED == 0);
        
        CAL_RTC->PRESCALER = 0x1FF;
        CAL_RTC->EVTENSET = RTC_EVTENSET_COMPARE0_Msk;
        CAL_RTC->INTENSET = RTC_INTENSET_COMPARE0_Msk;
        CAL_RTC->CC[0] = m_rtc_increment * 8;
        CAL_RTC->TASKS_START = 1;
        NVIC_SetPriority(CAL_RTC_IRQn, CAL_RTC_IRQ_Priority);
        NVIC_EnableIRQ(CAL_RTC_IRQn);  
    }
    
    void nrf_cal_set_callback(void (*callback)(void), uint32_t interval)
    {
        // Set the calendar callback, and set the callback interval in seconds
        cal_event_callback = callback;
        m_rtc_increment = interval;
        m_time += CAL_RTC->COUNTER / 10;
        CAL_RTC->TASKS_CLEAR = 1;
        CAL_RTC->CC[0] = interval * 10;  
    }
     
    void nrf_cal_set_time(uint32_t year, uint32_t month, uint32_t day, uint32_t hour, uint32_t minute, uint32_t second)
    {
        static time_t uncal_difftime, difftime, newtime;
        time_struct.tm_year = year - 1900;
        time_struct.tm_mon = month;
        time_struct.tm_mday = day;
        time_struct.tm_hour = hour;
        time_struct.tm_min = minute;
        time_struct.tm_sec = second;   
        //newtime = mktime(&time_struct);
        CAL_RTC->TASKS_CLEAR = 1;  
        
        // Calculate the calibration offset 
        if(m_last_calibrate_time != 0)
        {
            difftime = newtime - m_last_calibrate_time;
            uncal_difftime = m_time - m_last_calibrate_time;
            m_calibrate_factor = (float)difftime / (float)uncal_difftime;
        }
        
        // Assign the new time to the local time variables
        m_time = m_last_calibrate_time = newtime;
    }    
    
    struct tm *nrf_cal_get_time(void)
    {
        time_t return_time;
        return_time = m_time + CAL_RTC->COUNTER / 8;
        m_tm_return_time = *gmtime(&return_time);
        return &m_tm_return_time;
    }
    
    struct tm *nrf_cal_get_time_calibrated(void)
    {
        time_t uncalibrated_time, calibrated_time;
        if(m_calibrate_factor != 1.0f)
        {
            uncalibrated_time = m_time + CAL_RTC->COUNTER / 8;
            calibrated_time = m_last_calibrate_time + (time_t)((float)(uncalibrated_time - m_last_calibrate_time) * m_calibrate_factor + 0.5f);
            m_tm_return_time = *gmtime(&calibrated_time);
            return &m_tm_return_time;
        }
        else return nrf_cal_get_time();
    }
    
    char *nrf_cal_get_time_string(bool calibrated)
    {
        static char cal_string[80];
    //    strftime(cal_string, 80, "%H:%M:%S", (calibrated ? nrf_cal_get_time_calibrated() : nrf_cal_get_time()));
        return cal_string;
    }
     
    void CAL_RTC_IRQHandler(void)
    {
        if(CAL_RTC->EVENTS_COMPARE[0])
        {
            CAL_RTC->EVENTS_COMPARE[0] = 0;
            
            CAL_RTC->TASKS_CLEAR = 1;
            
            m_time += m_rtc_increment;
            if(cal_event_callback) cal_event_callback();
        }
    }
    

    I want to know the functions present in the file.

  • I have solved the COM port error,

    What was the problem, and how did you fix it?

    This could help future readers with the same issue.

    RTC is not giving any value in the Terminal

    What are you seeing in the terminal?

  • In addition to 's questions, how are you setting up the terminal, I.E. what baud rate are you using, etc.? The following terminal settings are recommended in our example projects:

    • Baud rate: 115.200
    • 8 data bits
    • 1 stop bit
    • No parity
    • HW flow control: None

    Best regards,

    Simon

Related