Device : nRF52840
Softdevice : s140_nRF_6.1.0
SDK : nRF5_SDK_15.2.0
Hi guys, I'm facing some trouble to put my rtc working properly. I made a code based on the rtc example but it's not incrementing the date the right way.
My code is as below:
void nrf_cal_init(void)
{
// Select the 32 kHz crystal and start the 32 kHz clock
//NRF_CLOCK->TASKS_LFCLKSTOP = 1;
NRF_CLOCK->TASKS_HFCLKSTOP = 1;
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);
/*nrf_drv_rtc_enable();*/
// Configure the RTC for 1 minute wakeup (default)
CAL_RTC->PRESCALER = 0xFFF;
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)
{
cal_event_callback = callback;
m_rtc_increment = interval;
m_time += CAL_RTC->COUNTER / 8;
CAL_RTC->TASKS_CLEAR = 1;
CAL_RTC->CC[0] = interval * 8;
}
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 = *localtime(&return_time);
//m_tm_return_time = *gmtime(&return_time);
RTCtime = m_tm_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 != 0.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 = *localtime(&calibrated_time);
//m_tm_return_time = *gmtime(&calibrated_time);
RTCtime = m_tm_return_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, "%x - %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;
//printf("rtc interrrupt\n");
if(cal_event_callback) cal_event_callback();
}
}
Problem : when i set time 30 mar 2019 23:59:02 and i read the the time after 1 min it will show 1 Apr 2019 00:00:02 instead of showing 31 mar 2019 00:00:02. Even i test the same thing for all months of 31 days, i am facing the problem. I did not understand the problem. Please give some suggestions to resolve the issue. Your quick reply would be highly appreciated.