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
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.