/** * @brief RTC IRQHandler. * @param None. * @return None. */ void RTC_IRQHandler() { S_RTC_TIME_DATA_T sCurTime; printf("RTC_IRQHandler running...\n"); /* RTC Tick interrupt */ if ((RTC->RIER & RTC_RIER_TIER_Msk) && (RTC->RIIR & RTC_RIIR_TIF_Msk)) { printf("RTC Tick Interrupt.\n"); RTC->RIIR = RTC_RIIR_TIF_Msk; } /* RTC Alarm interrupt */ if ((RTC->RIER & RTC_RIER_AIER_Msk) && (RTC->RIIR & RTC_RIIR_AIF_Msk)) { printf("RTC Alarm Interrupt.\n"); RTC->RIIR = RTC_RIIR_AIF_Msk; RTC_GetDateAndTime(&sCurTime); printf("Current Time:%d/%02d/%02d %02d:%02d:%02d\n",sCurTime.u32Year,sCurTime.u32Month,sCurTime.u32Day,sCurTime.u32Hour,sCurTime.u32Minute,sCurTime.u32Second); RTC_DISABLE_TICK_WAKEUP(); /* RTC tick shouldn't wake up CPU */ planNextRTCInterrupt(&sCurTime); } if ((RTC->RIER & RTC_RIER_SNOOPIER_Msk) && (RTC->RIIR & RTC_RIIR_SNOOPIF_Msk)) /* snooper interrupt occurred */ { RTC->RIIR = RTC_RIIR_SNOOPIF_Msk; } }
time_t rtc_read(void) { if (! rtc_inited) { rtc_init(); } S_RTC_TIME_DATA_T rtc_datetime; RTC_GetDateAndTime(&rtc_datetime); struct tm timeinfo; // Convert struct tm to S_RTC_TIME_DATA_T timeinfo.tm_year = rtc_datetime.u32Year - YEAR0; timeinfo.tm_mon = rtc_datetime.u32Month - 1; timeinfo.tm_mday = rtc_datetime.u32Day; timeinfo.tm_wday = rtc_datetime.u32DayOfWeek; timeinfo.tm_hour = rtc_datetime.u32Hour; timeinfo.tm_min = rtc_datetime.u32Minute; timeinfo.tm_sec = rtc_datetime.u32Second; // Convert to timestamp time_t t = mktime(&timeinfo); return t; }
time_t rtc_read(void) { // NOTE: After boot, RTC time registers are not synced immediately, about 1 sec latency. // RTC time got (through RTC_GetDateAndTime()) in this sec would be last-synced and incorrect. // NUC472/M453: Known issue // M487: Fixed if (! rtc_isenabled()) { rtc_init(); } S_RTC_TIME_DATA_T rtc_datetime; RTC_GetDateAndTime(&rtc_datetime); struct tm timeinfo; // Convert struct tm to S_RTC_TIME_DATA_T timeinfo.tm_year = rtc_datetime.u32Year - YEAR0; timeinfo.tm_mon = rtc_datetime.u32Month - 1; timeinfo.tm_mday = rtc_datetime.u32Day; timeinfo.tm_wday = rtc_datetime.u32DayOfWeek; timeinfo.tm_hour = rtc_datetime.u32Hour; if (rtc_datetime.u32TimeScale == RTC_CLOCK_12 && rtc_datetime.u32AmPm == RTC_PM) { timeinfo.tm_hour += 12; } timeinfo.tm_min = rtc_datetime.u32Minute; timeinfo.tm_sec = rtc_datetime.u32Second; // Convert to timestamp time_t t; if (_rtc_maketime(&timeinfo, &t, RTC_FULL_LEAP_YEAR_SUPPORT) == false) { return 0; } return t; }
/** * @brief Main routine. * @param None. * @return None. */ int32_t main(void) { S_RTC_TIME_DATA_T sCurTime; SYS_Init(); UART0_Init(); /* Unlock protected registers */ SYS_UnlockReg(); printf("\nNANO130 RTC Wakeup Demo \n"); /* Time Setting */ sCurTime.u32Year = 2014; sCurTime.u32Month = 10; sCurTime.u32Day = 1; sCurTime.u32Hour = 0; sCurTime.u32Minute = 0; sCurTime.u32Second = 0; sCurTime.u32DayOfWeek = RTC_TUESDAY; sCurTime.u32TimeScale = RTC_CLOCK_24; RTC_Open(&sCurTime); /* Read curent RTC time */ RTC_GetDateAndTime(&sCurTime); printf("Current Time:%d/%02d/%02d %02d:%02d:%02d\n",sCurTime.u32Year,sCurTime.u32Month,sCurTime.u32Day,sCurTime.u32Hour,sCurTime.u32Minute,sCurTime.u32Second); /* Enable RTC alarm for 1 minute to update RTC time */ RTC_DISABLE_TICK_WAKEUP(); /* RTC tick shouldn't wake up CPU */ planNextRTCInterrupt(&sCurTime); _Wakeup_Flag = 0; while(1) { printf("\nGoing to Power Down...\n"); while(!(UART0->FSR & UART_FSR_TE_F_Msk)) ; /* waits for message send out */ /* Enter power down mode */ Enter_PowerDown(); printf("Program resume...\n"); if (_Wakeup_Flag == 1) { _Wakeup_Flag = 0; printf("System Wakeup success!! \n"); } } }
void RTCUtils_GetDateTime(RTCUtils_DateTime_t *dateTime) { S_RTC_TIME_DATA_T rtcData; uint32_t primask; // Atomic (RTC can't be closed) if(!RTCUtils_isRTCOpen) { return; } // Grab RTC data (protect against concurrent SetDateTime) primask = Thread_IrqDisable(); RTC_GetDateAndTime(&rtcData); Thread_IrqRestore(primask); // Populate dateTime dateTime->year = rtcData.u32Year - 2000; dateTime->month = rtcData.u32Month; dateTime->day = rtcData.u32Day; dateTime->dayOfWeek = rtcData.u32DayOfWeek; dateTime->hour = rtcData.u32Hour; dateTime->minute = rtcData.u32Minute; dateTime->second = rtcData.u32Second; }
/** * @brief Main routine. * @param None. * @return None. */ int32_t main(void) { S_RTC_TIME_DATA_T sCurTime; SYS_Init(); UART0_Init(); DEBUG_MSG("\nNANO130 NuTiny EVB Demo Program V1.0.0\n"); DEBUG_MSG("[Power Down Demo]\n"); /* Unlock protected registers */ SYS_UnlockReg(); /* Time Setting */ sCurTime.u32Year = 2013; sCurTime.u32Month = 10; sCurTime.u32Day = 15; sCurTime.u32Hour = 0; sCurTime.u32Minute = 0; sCurTime.u32Second = 0; sCurTime.u32DayOfWeek = RTC_TUESDAY; sCurTime.u32TimeScale = RTC_CLOCK_24; RTC_Open(&sCurTime); DEBUG_MSG("RTC Init. complete!\n"); /* Do LCD Initializaton */ LCD_Open(LCD_C_TYPE, 4, LCD_BIAS_THIRD, LCD_FREQ_DIV64, LCD_CPVOl_3V); LCD_EnableDisplay(); DEBUG_MSG("LCD Init. complete!\n"); /* Start displaying on LCD */ LCDLIB_SetSymbol(2, 27, 1); CLK_SysTickDelay(335000); textticker("*** NUVOTON NANO130 ***", 335000); CLK_SysTickDelay(335000); LCDLIB_Printf(0, "NUVOTON"); LCD_EnableBlink(250); CLK_SysTickDelay(335000); CLK_SysTickDelay(335000); CLK_SysTickDelay(335000); CLK_SysTickDelay(335000); CLK_SysTickDelay(335000); LCD_DisableBlink(); /* Read curent RTC time */ RTC_GetDateAndTime(&sCurTime); DEBUG_MSG("Current Time:%d/%02d/%02d %02d:%02d:%02d\n",sCurTime.u32Year,sCurTime.u32Month,sCurTime.u32Day,sCurTime.u32Hour,sCurTime.u32Minute,sCurTime.u32Second); /* Display RTC time */ showTime(sCurTime.u32Hour, sCurTime.u32Minute); DEBUG_MSG("Start MAIN loop.\n"); while(1) { textticker("*** GOING TO POWER DOWN ***", 335000); DEBUG_MSG("Going to Power Down...\n"); #ifdef __DEBUG_MSG while(!(UART1->FSR & UART_FSR_TE_F)) ; /* waits for message send out */ #endif /* Enter power down mode */ /* This sample will not wake up*/ Enter_PowerDown(); DEBUG_MSG("Program resume...\n"); if (_Wakeup_Flag == 1) { _Wakeup_Flag = 0; textticker("*** WAKE UP ***", 335000); CLK_SysTickDelay(335000); CLK_SysTickDelay(335000); CLK_SysTickDelay(335000); } }; }