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

RTC 31st date problem in NRF52840

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. 

Parents Reply Children
No Data
Related