static int rtc_sub_alarm_test(u32 f_time, u32 f_date) { volatile int hit; int result = 0; rtc_reset(); printf("RTC Time = W%d %d%d:%d%d:%d%d:%d\n", tm.dow, tm.ten_hr, tm.hr, \ tm.ten_min, tm.min, tm.ten_sec, tm.sec, tm.sos); printf("RTC Date = C%d%d %d%d/%d%d/%d%d\n", dt.ten_cent, dt.cent, dt.ten_yr, dt.yr, \ dt.ten_mth, dt.mth, dt.ten_day, dt.day); printf("Alarm Time = W%d %d%d:%d%d:%d%d:%d\n", tm_a.dow, tm_a.ten_hr, tm_a.hr, \ tm_a.ten_min, tm_a.min, tm_a.ten_sec, tm_a.sec, tm_a.sos); printf("Alarm Date = C%d%d %d%d/%d%d/%d%d\n", dt_a.ten_cent, dt_a.cent, dt_a.ten_yr, dt_a.yr, \ dt_a.ten_mth, dt_a.mth, dt_a.ten_day, dt_a.day); printf("Alarm Time on: "); if (f_time & SOCLE_RTC_TALRM_CSOS) printf("\"Sixteen of Second\" "); if (f_time & SOCLE_RTC_TALRM_CS) printf("\"Second\" "); if (f_time & SOCLE_RTC_TALRM_CM) printf("\"Minute\" "); if (f_time & SOCLE_RTC_TALRM_CH) printf("\"Hour\" "); if (f_time & SOCLE_RTC_TALRM_CDOW) printf("\"Day of Week\""); printf("\n"); printf("Alarm Date on: "); if (f_date & SOCLE_RTC_DALRM_CD) printf("\"Day\" "); if (f_date & SOCLE_RTC_DALRM_CM) printf("\"Month\" "); if (f_date & SOCLE_RTC_DALRM_CY) printf("\"Year\" "); if (f_date & SOCLE_RTC_DALRM_CC) printf("\"Century\""); printf("\n"); rtc_set_time_alarm(&tm_a, f_time); rtc_set_date_alarm(&dt_a, f_date); hit = 0; rtc_set_date(&dt); rtc_set_time(&tm); printf("alarm after 15 second...\n"); return result; }
/** * \brief Configure RTC for test * \Set alarm ewery second */ void configure_rtc (void) { uint32_t status; struct _time MTU = {00, 00, 00}; struct _time MTA = {18, 30, 00}; struct _date MDT = {2015, 06, 01, 1}; rtc_set_hour_mode(0); // mode 24h status = rtc_set_time(&MTU); status |= rtc_set_date(&MDT); status |= rtc_set_time_alarm(&MTA); status |= rtc_set_time_event (RTC_CR_TIMEVSEL_MINUTE); rtc_disable_it (RTC_IER_ACKEN | RTC_IER_ALREN | RTC_IER_SECEN | RTC_IER_TIMEN | RTC_IER_CALEN); rtc_enable_it (RTC_IER_SECEN); aic_set_source_vector(ID_SYSC, rtc_irq_handler); aic_enable(ID_SYSC); }
extern int rtc_set_time_alarm_test(int autotest) { u32_t flag = 0; rtc_time_t time; char input[1]; printf("Please input the RTC alarm time, ex: on Monday, 5:30:40:00 PM\n"); printf("Set Time = 1:17:30:40:00, Your Time = "); scanf("%d:%1d%1d:%1d%1d:%1d%1d:%d", &time.dow, &time.ten_hr, &time.hr, \ &time.ten_min, &time.min, &time.ten_sec, &time.sec, &time.sos); PDEBUG("Input Time = %d:%d%d:%d%d:%d%d:%d\n", time.dow, time.ten_hr, time.hr, \ time.ten_min, time.min, time.ten_sec, time.sec, time.sos); printf("Alarm Time on Sixteen of Second? (y/n)... "); input[0] = getchar(); if (('y' == input[0]) || ('Y' == input[0])) flag |= SOCLE_RTC_TALRM_CSOS; printf("Alarm Time on Second? (y/n)... "); input[0] = getchar(); if (('y' == input[0]) || ('Y' == input[0])) flag |= SOCLE_RTC_TALRM_CS; printf("Alarm Time on Minute? (y/n)... "); input[0] = getchar(); if (('y' == input[0]) || ('Y' == input[0])) flag |= SOCLE_RTC_TALRM_CM; printf("Alarm Time on Hour? (y/n)... "); input[0] = getchar(); if (('y' == input[0]) || ('Y' == input[0])) flag |= SOCLE_RTC_TALRM_CH; printf("Alarm Time on Day of Week? (y/n)... "); input[0] = getchar(); if (('y' == input[0]) || ('Y' == input[0])) flag |= SOCLE_RTC_TALRM_CDOW; rtc_set_time_alarm(&time, flag); return 0; }
extern int auto_poweroff_alarm_test(int autotest) { int count_down_s = 5; rtc_reset(); // Set alarm date and alarm time // alarm date = C21 06/12/31 dt_a.ten_cent = 2; dt_a.cent = 1; dt_a.ten_yr = 0; dt_a.yr = 6; dt_a.ten_mth = 1; dt_a.mth = 2; dt_a.ten_day = 3; dt_a.day = 1; rtc_set_date_alarm(&dt_a, SOCLE_RTC_DALRM_CD | SOCLE_RTC_DALRM_CM | SOCLE_RTC_DALRM_CY | SOCLE_RTC_DALRM_CC); // alarm time = Wed 17:58:1count_down_s.10 tm_a.dow = 3; tm_a.ten_hr = 1; tm_a.hr = 7; tm_a.ten_min = 5; tm_a.min = 8; tm_a.ten_sec = 1; tm_a.sec = count_down_s; tm_a.sos = 10; rtc_set_time_alarm(&tm_a, SOCLE_RTC_TALRM_CSOS | SOCLE_RTC_TALRM_CS | SOCLE_RTC_TALRM_CM | SOCLE_RTC_TALRM_CH | SOCLE_RTC_TALRM_CDOW); // Set date and time // date = C21 06/12/31 dt.ten_cent = 2; dt.cent = 1; dt.ten_yr = 0; dt.yr = 6; dt.ten_mth = 1; dt.mth = 2; dt.ten_day = 3; dt.day = 1; rtc_set_date(&dt); // time = Wed 17:58:10.2 tm.dow = 3; tm.ten_hr = 1; tm.hr = 7; tm.ten_min = 5; tm.min = 8; tm.ten_sec = 1; tm.sec = 0; tm.sos = 2; rtc_set_time(&tm); printf("Count down %d seconds...\n", count_down_s); printf("Sleeping...\n"); EN_RTC_ALARM_POWER_ON(); ENTER_RTC_POWER_OFF_MODE(); return 0; }
static int rtc_sub_alarm_test(u32_t f_time, u32_t f_date) { volatile int hit; int result = 0; rtc_reset(); printf("RTC Time = W%d %d%d:%d%d:%d%d:%d\n", tm.dow, tm.ten_hr, tm.hr, \ tm.ten_min, tm.min, tm.ten_sec, tm.sec, tm.sos); printf("RTC Date = C%d%d %d%d/%d%d/%d%d\n", dt.ten_cent, dt.cent, dt.ten_yr, dt.yr, \ dt.ten_mth, dt.mth, dt.ten_day, dt.day); printf("Alarm Time = W%d %d%d:%d%d:%d%d:%d\n", tm_a.dow, tm_a.ten_hr, tm_a.hr, \ tm_a.ten_min, tm_a.min, tm_a.ten_sec, tm_a.sec, tm_a.sos); printf("Alarm Date = C%d%d %d%d/%d%d/%d%d\n", dt_a.ten_cent, dt_a.cent, dt_a.ten_yr, dt_a.yr, \ dt_a.ten_mth, dt_a.mth, dt_a.ten_day, dt_a.day); printf("Alarm Time on: "); if (f_time & SOCLE_RTC_TALRM_CSOS) printf("\"Sixteen of Second\" "); if (f_time & SOCLE_RTC_TALRM_CS) printf("\"Second\" "); if (f_time & SOCLE_RTC_TALRM_CM) printf("\"Minute\" "); if (f_time & SOCLE_RTC_TALRM_CH) printf("\"Hour\" "); if (f_time & SOCLE_RTC_TALRM_CDOW) printf("\"Day of Week\""); printf("\n"); printf("Alarm Date on: "); if (f_date & SOCLE_RTC_DALRM_CD) printf("\"Day\" "); if (f_date & SOCLE_RTC_DALRM_CM) printf("\"Month\" "); if (f_date & SOCLE_RTC_DALRM_CY) printf("\"Year\" "); if (f_date & SOCLE_RTC_DALRM_CC) printf("\"Century\""); printf("\n"); rtc_set_time_alarm(&tm_a, f_time); rtc_set_date_alarm(&dt_a, f_date); hit = 0; // enable interrupt request_irq(RTC_INT, rtc_isr_alarm_hit, (void *)&hit); rtc_set_date(&dt); rtc_set_time(&tm); printf("Waiting for the alarm...\n"); if (socle_wait_for_int(&hit, 10)) { printf("Timeout!!\n"); result = -1; } // disable interrupt free_irq(RTC_INT); return result; }
/** * \brief Application entry point for RTC example. * * \return Unused (ANSI-C compatibility). */ int main(void) { uint8_t uc_key; /* Initialize the SAM system */ sysclk_init(); board_init(); /* Initialize the console uart */ configure_console(); /* Output example information */ puts(STRING_HEADER); /* Default RTC configuration, 24-hour mode */ rtc_set_hour_mode(RTC, 0); /* Configure RTC interrupts */ NVIC_DisableIRQ(RTC_IRQn); NVIC_ClearPendingIRQ(RTC_IRQn); NVIC_SetPriority(RTC_IRQn, 0); NVIC_EnableIRQ(RTC_IRQn); rtc_enable_interrupt(RTC, RTC_IER_SECEN | RTC_IER_ALREN); /* Refresh display once */ refresh_display(); /* Handle keypresses */ while (1) { while (uart_read(CONSOLE_UART, &uc_key)); /* Set time */ if (uc_key == 't') { gs_ul_state = STATE_SET_TIME; do { puts("\n\r\n\r Set time(hh:mm:ss): "); } while (get_new_time()); /* If valid input, none of the variables for time is 0xff. */ if (gs_ul_new_hour != 0xFFFFFFFF && (gs_uc_rtc_time[2] == ':') && (gs_uc_rtc_time[5] == ':')) { if (rtc_set_time(RTC, gs_ul_new_hour, gs_ul_new_minute, gs_ul_new_second)) { puts("\n\r Time not set, invalid input!\r"); } } else { gs_uc_rtc_time[2] = ':'; gs_uc_rtc_time[5] = ':'; puts("\n\r Time not set, invalid input!\r"); } gs_ul_state = STATE_MENU; gs_ul_menu_shown = 0; refresh_display(); } /* Set date */ if (uc_key == 'd') { gs_ul_state = STATE_SET_DATE; do { puts("\n\r\n\r Set date(mm/dd/yyyy): "); } while (get_new_date()); /* If valid input, none of the variables for date is 0xff(ff). */ if (gs_ul_new_year != 0xFFFFFFFF && (gs_uc_date[2] == '/') && (gs_uc_date[5] == '/')) { if (rtc_set_date(RTC, gs_ul_new_year, gs_ul_new_month, gs_ul_new_day, gs_ul_new_week)) { puts("\n\r Date not set, invalid input!\r"); } } else { gs_uc_date[2] = '/'; gs_uc_date[5] = '/'; puts("\n\r Time not set, invalid input!\r"); } /* Only 'mm/dd' is input. */ if (gs_ul_new_month != 0xFFFFFFFF && gs_ul_new_year == 0xFFFFFFFF) { puts("\n\r Not Set for no year field!\r"); } gs_ul_state = STATE_MENU; gs_ul_menu_shown = 0; refresh_display(); } /* Set time alarm */ if (uc_key == 'i') { gs_ul_state = STATE_SET_TIME_ALARM; rtc_clear_date_alarm(RTC); do { puts("\n\r\n\r Set time alarm(hh:mm:ss): "); } while (get_new_time()); if (gs_ul_new_hour != 0xFFFFFFFF && (gs_uc_rtc_time[2] == ':') && (gs_uc_rtc_time[5] == ':')) { if (rtc_set_time_alarm(RTC, 1, gs_ul_new_hour, 1, gs_ul_new_minute, 1, gs_ul_new_second)) { puts("\n\r Time alarm not set, invalid input!\r"); } else { printf("\n\r Time alarm is set at %02u:%02u:%02u!", (unsigned int)gs_ul_new_hour, (unsigned int)gs_ul_new_minute, (unsigned int)gs_ul_new_second); } } else { gs_uc_rtc_time[2] = ':'; gs_uc_rtc_time[5] = ':'; puts("\n\r Time not set, invalid input!\r"); } gs_ul_state = STATE_MENU; gs_ul_menu_shown = 0; gs_ul_alarm_triggered = 0; refresh_display(); } /* Set date alarm */ if (uc_key == 'm') { gs_ul_state = STATE_SET_DATE_ALARM; rtc_clear_time_alarm(RTC); do { puts("\n\r\n\r Set date alarm(mm/dd/yyyy): "); } while (get_new_date()); if (gs_ul_new_year != 0xFFFFFFFF && (gs_uc_date[2] == '/') && (gs_uc_date[5] == '/')) { if (rtc_set_date_alarm(RTC, 1, gs_ul_new_month, 1, gs_ul_new_day)) { puts("\n\r Date alarm not set, invalid input!\r"); } else { printf("\n\r Date alarm is set on %02u/%02u/%4u!", (unsigned int)gs_ul_new_month, (unsigned int)gs_ul_new_day, (unsigned int)gs_ul_new_year); } } else { gs_uc_date[2] = '/'; gs_uc_date[5] = '/'; puts("\n\r Date alarm not set, invalid input!\r"); } gs_ul_state = STATE_MENU; gs_ul_menu_shown = 0; gs_ul_alarm_triggered = 0; refresh_display(); } #if ((SAM3S8) || (SAM3SD8) || (SAM4S) || (SAM4C) || (SAM4CP) || (SAM4CM)) /* Generate Waveform */ if (uc_key == 'w') { gs_ul_state = STATE_WAVEFORM; puts("\n\rMenu:\n\r" " 0 - No Waveform\n\r" " 1 - 1 Hz square wave\n\r" " 2 - 32 Hz square wave\n\r" " 3 - 64 Hz square wave\n\r" " 4 - 512 Hz square wave\n\r" " 5 - Toggles when alarm flag rise\n\r" " 6 - Copy of the alarm flag\n\r" " 7 - Duty cycle programmable pulse\n\r" " 8 - Quit\r"); while (1) { while (uart_read(CONSOLE_UART, &uc_key)); if ((uc_key >= '0') && (uc_key <= '7')) { rtc_set_waveform(RTC, 0, char_to_digit(uc_key)); } if (uc_key == '8') { gs_ul_state = STATE_MENU; gs_ul_menu_shown = 0; refresh_display(); break; } } } #endif /* Clear trigger flag */ if (uc_key == 'c') { gs_ul_alarm_triggered = 0; gs_ul_menu_shown = 0; refresh_display(); } } }
int main(void) { uint8_t ucKey; /* Disable watchdog */ wdt_disable(); /* Configure console */ board_cfg_console(); /* Output example information */ printf("\r\n\r\n\r\n"); printf("-- RTC Example " SOFTPACK_VERSION " --\r\n"); printf("-- " BOARD_NAME "\r\n"); printf("-- Compiled: " __DATE__ " " __TIME__ " --\n\r"); // put 25 °C as a default temp, if there is no temprature sensor Temperature = 25; printf("Configure TC.\r\n"); configure_tc(); /* Default RTC configuration */ rtc_set_hour_mode(0); /* 24-hour mode */ struct _time empty_time = {0,0,0}; if (rtc_set_time_alarm(&empty_time)) { printf("\r\n Disable time alarm fail!"); } struct _date empty_date = {0,0,0}; if (rtc_set_date_alarm(&empty_date)) { printf("\r\n Disable date alarm fail!"); } /* Configure RTC interrupts */ rtc_enable_it(RTC_IER_SECEN | RTC_IER_ALREN); aic_set_source_vector(ID_SYSC, sysc_handler); aic_enable(ID_SYSC); /* Refresh display once */ _RefreshDisplay(); new_time.hour = 0; new_time.min = 0; new_time.sec = 30; rtc_set_time_alarm(&new_time); bMenuShown = 0; alarmTriggered = 0; rtc_calibration(Temperature); /* Handle keypresses */ while (1) { ucKey = console_get_char(); /* set time */ if (ucKey == 't') { bState = STATE_SET_TIME; aic_disable(ID_TC0); do { printf("\r\n\r\n Set time(hh:mm:ss): "); } while (get_new_time()); /* if valid input, none of variable for time is 0xff */ if (new_time.hour != 0xFF) { if (rtc_set_time (&new_time)) { printf ("\r\n Time not set, invalid input!\n\r"); } } bState = STATE_MENU; bMenuShown = 0; _RefreshDisplay(); CountDownTimer = 0; aic_enable(ID_TC0); } /* clock calibration */ else if (ucKey == 'p') { rtc_calibration(30); bState = STATE_MENU; bMenuShown = 0; _RefreshDisplay(); } /* set date */ else if (ucKey == 'd') { bState = STATE_SET_DATE; aic_disable(ID_TC0); do { printf("\r\n\r\n Set date(mm/dd/yyyy): "); } while (get_new_date()); /* if valid input, none of variable for date is 0xff(ff) */ if (new_date.year != 0xFFFF) { if (rtc_set_date(&new_date)) { printf ("\r\n Date not set, invalid input!\r\n"); } } /* only 'mm/dd' inputed */ if (new_date.month != 0xFF && new_date.year == 0xFFFF) { printf("\r\n Not Set for no year field!\r\n"); } bState = STATE_MENU; bMenuShown = 0; CountDownTimer = 0; aic_enable(ID_TC0); _RefreshDisplay(); } /* set time alarm */ else if (ucKey == 'i') { bState = STATE_SET_TIME_ALARM; aic_disable(ID_TC0); do { printf("\r\n\r\n Set time alarm(hh:mm:ss): "); } while (get_new_time()); if (new_time.hour != 0xFF) { if (rtc_set_time_alarm(&new_time)) { printf ("\r\n Time alarm not set, invalid input!\r\n"); } else { printf ("\r\n Time alarm is set at %02d:%02d:%02d!", new_time.hour, new_time.min, new_time.sec); } } bState = STATE_MENU; bMenuShown = 0; alarmTriggered = 0; CountDownTimer = 0; aic_enable(ID_TC0); _RefreshDisplay(); } /* set date alarm */ else if (ucKey == 'm') { bState = STATE_SET_DATE_ALARM; aic_disable(ID_TC0); do { printf("\r\n\r\n Set date alarm(mm/dd/): "); } while (get_new_date()); if (new_date.year == 0xFFFF && new_date.month != 0xFF) { if (rtc_set_date_alarm(&new_date)) { printf ("\r\n Date alarm not set, invalid input!\r\n"); } else { printf ("\r\n Date alarm is set on %02d/%02d!", new_date.month, new_date.day); } } bState = STATE_MENU; bMenuShown = 0; alarmTriggered = 0; CountDownTimer = 0; aic_enable(ID_TC0); _RefreshDisplay(); } /* clear trigger flag */ else if (ucKey == 'c') { alarmTriggered = 0; bMenuShown = 0; _RefreshDisplay(); } /* quit */ else if (ucKey == 'q') { break; } } return 0; }