This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hello, I'm having problem with RTC on MSP430FR5739 with LPM3.5.
I'm implementing an Calendar DATE an Time with RTC_B module and print date and time on an E-paper.
The goal is to print updated time and date on E-paper after 1 minute.
The problem is that te time is not updated.
I have this code:
void RTC_init(void) { RTCCTL01 |= RTCHOLD + RTCTEV_0 + RTCTEVIE; //hold rtc for setting; enable rtc ready interrupt; 1min // Init time RTCSEC = 00; // Set Seconds RTCMIN = RTCMIN_INIT; // Set Minutes RTCHOUR = RTCHOUR_INIT; // Set Hours // Init date RTCDOW = RTCDOW_INIT; //Set DOW RTCDAY = RTCDAY_INIT; // Set Day RTCMON = RTCMON_INIT; // Set Month RTCYEAR = RTCYEAR_INIT; // Set Year RTCCTL01 &= ~RTCHOLD; // release rtchold, begin count } int main(void) { /* Initialize system clock, port, ecc. */ system_init(); // Calculate Temperature with ADC. // this function initialize ADC and print on e-paper Temperature. updateTemp(); //Print on e-paper Date and Time printDate_Epaper(RTCDAY_INIT,RTCMON_INIT, RTCYEAR_INIT); printTime_Epaper(RTCHOUR_INIT,RTCMIN_INIT); RTC_init(); __no_operation(); while (1) { PMMCTL0_H = PMMPW_H; PMMCTL0_L |= PMMREGOFF_L; PMMCTL0_L &= ~SVSLE_L; PM5CTL0 |= LOCKLPM5; __bis_SR_register(LPM3_bits+GIE); //enable interrupts // __no_operation(); } } // RTC_b ISR #pragma vector=RTC_VECTOR __interrupt void rtc_isr(void) { switch (__even_in_range(RTCIV, 0x12)) { case RTCIV_NONE: break; // No interrupt case RTCIV_RTCRDYIFG: // rtc ready break; case RTCIV_RTCTEVIFG: // rtc interval timer PMMCTL0_H = PMMPW_H; // open PMM PMMCTL0_L &= ~PMMREGOFF_L; PMMCTL0_L |= SVSLE_L; PM5CTL0 &= ~LOCKLPM5; // Clear LOCKIO and enable ports __no_operation(); RTCMIN_INIT = RTCMIN; RTCHOUR_INIT = RTCHOUR; RTCDOW_INIT = RTCDOW; RTCDAY_INIT = RTCDAY; RTCMON_INIT = RTCMON; RTCYEAR_INIT = RTCYEAR; //Print on e-paper Date and Time printDate_Epaper(RTCDAY_INIT,RTCMON_INIT, RTCYEAR_INIT); printTime_Epaper(RTCHOUR_INIT,RTCMIN_INIT); //calculate updated Temperature and print it's value on e-paper updateTemp(tempChar); __bic_SR_register_on_exit(LPM3_bits+GIE); __no_operation(); break; case RTCIV_RTCAIFG: break; // rtc user alarm case RTCIV_RT0PSIFG: break; // rtc prescaler 0 case RTCIV_RT1PSIFG: break; // rtc prescaler 1 case RTCIV_RTCOFIFG: break; // rtc oscillator fault default: break; } }
Regards
I resolve this issue, rewriting the code.
Below is the code:
void RTC_init(void) { RTCCTL01 |= RTCHOLD + RTCTEV_0 + RTCTEVIE; //hold rtc for setting; enable rtc ready interrupt; 1min // Init time RTCSEC = 00; // Set Seconds RTCMIN = RTCMIN_INIT; // Set Minutes RTCHOUR = RTCHOUR_INIT; // Set Hours // Init date RTCDOW = RTCDOW_INIT; //Set DOW RTCDAY = RTCDAY_INIT; // Set Day RTCMON = RTCMON_INIT; // Set Month RTCYEAR = RTCYEAR_INIT; // Set Year RTCCTL01 &= ~RTCHOLD; // release rtchold, begin count } void Gpio_sleep_Init(void) { // Port Configuration P1OUT = 0x00; P1DIR = 0xFF; P2OUT = 0x00; P2DIR = 0xFF; P3OUT = 0x00; P3DIR = 0xFF; P4OUT = 0x00; P4DIR = 0xFF; PJOUT = 0x00; PJSEL0 |= BIT4; PJDIR = 0xFFFF; } int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop Watchdog Timer if (SYSRSTIV == SYSRSTIV_LPM5WU) { // When woken up from LPM3.5, reinit Gpio_sleep_Init(); PM5CTL0 &= ~LOCKLPM5; /* Initialize system clock and TI LaunchPad board */ system_init(); // Re-initialize RTC RTCCTL01 |= RTCHOLD + RTCTEV_0 + RTCTEVIE;//hold rtc for setting; enable rtc ready interrupt; 1min RTCCTL01 &= ~RTCHOLD; // release rtchold, begin count // Re-enter in LPM3.5 mode PMMCTL0_H = PMMPW_H; PMMCTL0_L |= PMMREGOFF_L; else { Gpio_sleep_Init(); /* Initialize system clock and TI LaunchPad board */ system_init(); PM5CTL0 &= ~LOCKLPM5; // Calculate Temperature with ADC. // this function initialize ADC and print on e-paper Temperature. updateTemp(); //Print on e-paper Date and Time printDate_Epaper(RTCDAY_INIT,RTCMON_INIT, RTCYEAR_INIT); printTime_Epaper(RTCHOUR_INIT,RTCMIN_INIT); // Initialize RTC RTC_init(); PMMCTL0_H = PMMPW_H; PMMCTL0_L |= PMMREGOFF_L; __bis_SR_register(LPM3_bits+GIE); //enable interrupts } // RTC_b ISR #pragma vector=RTC_VECTOR __interrupt void rtc_isr(void) { switch (__even_in_range(RTCIV, 0x12)) { case RTCIV_NONE: break; // No interrupt case RTCIV_RTCRDYIFG: // rtc ready break; case RTCIV_RTCTEVIFG: // rtc interval timer RTCMIN_INIT = RTCMIN; RTCHOUR_INIT = RTCHOUR; RTCDOW_INIT = RTCDOW; RTCDAY_INIT = RTCDAY; RTCMON_INIT = RTCMON; RTCYEAR_INIT = RTCYEAR; //Print on e-paper Date and Time printDate_Epaper(RTCDAY_INIT,RTCMON_INIT, RTCYEAR_INIT); printTime_Epaper(RTCHOUR_INIT,RTCMIN_INIT); //calculate updated Temperature and print it's value on e-paper updateTemp(tempChar); break; case RTCIV_RTCAIFG: break; // rtc user alarm case RTCIV_RT0PSIFG: break; // rtc prescaler 0 case RTCIV_RT1PSIFG: break; // rtc prescaler 1 case RTCIV_RTCOFIFG: break; // rtc oscillator fault default: break; } }
**Attention** This is a public forum