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.

LMP3.5 and RTC on MSP430FR5739

Other Parts Discussed in Thread: MSP430FR5739

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