RTC with VBAT - Bare Metal

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

RTC with VBAT - Bare Metal

1,276 Views
weblar
Contributor V

I'm trying to get the RTC working on a Kinetis K60 which uses a coin cell for battery backup.

The problem I'm having is that when I reset the system, each time I attempt to read the RTC_TSR using the rtc_get_time function, I always get a TIF (time invalid) flag set in the status register. The only way this can work is if I write RTC_TSR = 0 in the initialization routine, which doesn't seem correct (its meant to be a battery backed-up register, no?).

I'm using the following code...

void rtc_init() {

  // Reset the RTC by setting and clearing the SWR bit in the control register

  RTC_CR |= RTC_CR_SWR_MASK;

  RTC_CR &= ~RTC_CR_SWR_MASK;

  RTC_TAR = 0xFFFFFFFF;

  // Enable the oscillator

  RTC_CR |= RTC_CR_OSCE_MASK;

  delay_ms(125);

  RTC_TCR = RTC_TCR_CIR(0) | RTC_TCR_TCR(0);

  //RTC_TSR = 0;

  RTC_TAR = 0;

  RTC_TPR = 0;

  // Enable the time counter

  RTC_SR |= RTC_SR_TCE_MASK;

}

void rtc_set_time(uint32_t ticks) {

  // Disable the RTC

  RTC_SR &= ~RTC_SR_TCE_MASK;

  // Set the new time since UNIX epoch (01/01/1970)

  RTC_TSR = ticks;

  // Enable the RTC

  RTC_SR |= RTC_SR_TCE_MASK;

}

void rtc_get_time(uint32_t *ticks) {

  uint32_t sr = RTC_SR;

  if (sr & RTC_SR_TIF_MASK) {

  // Time Invalid flag set

  }

  *ticks = RTC_TSR;

}

I'm well aware that I'm probably doing something stupid but I can't for the life of me figure it out.

Any suggestions are very welcome.

Thanks,

Kev

Labels (1)
0 Kudos
1 Reply

356 Views
zhaohuiliu
NXP Employee
NXP Employee

Hi,

Please read TIF flag and TSR register description more carefully in RM. TSR must be initilized before you can use it. It is a design requirment.

0 Kudos