/** * \brief Application entry point for RTC tamper example. * * \return Unused (ANSI-C compatibility). */ int main(void) { uint32_t ul_read_value[8] = {0, 0 ,0, 0, 0, 0, 0, 0}; uint32_t ul_hour0, ul_minute0, ul_second0; uint32_t ul_year0, ul_month0, ul_day0, ul_week0; uint32_t ul_hour1, ul_minute1, ul_second1; uint32_t ul_year1, ul_month1, ul_day1, ul_week1; uint32_t tmp_src0, tmp_src1, tmp_cnt; 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); rtc_set_waveform(RTC, RTC_OUT_CHN, RTC_OUT_SRC); if(rstc_get_reset_cause(RSTC) == RSTC_SR_RSTTYP_BackupReset) { /* Read the data from GPBR0 ~ 7 */ ul_read_value[0] = gpbr_read(GPBR0); ul_read_value[1] = gpbr_read(GPBR1); ul_read_value[2] = gpbr_read(GPBR2); ul_read_value[3] = gpbr_read(GPBR3); ul_read_value[4] = gpbr_read(GPBR4); ul_read_value[5] = gpbr_read(GPBR5); ul_read_value[6] = gpbr_read(GPBR6); ul_read_value[7] = gpbr_read(GPBR7); if((ul_read_value[0] == 0) && (ul_read_value[1] == 0) && (ul_read_value[2] == 0) && (ul_read_value[3] == 0) && (ul_read_value[4] == 0) && (ul_read_value[5] == 0) && (ul_read_value[6] == 0) && (ul_read_value[7] == 0)) { printf("The backup register is cleared when tamper event happen!\r\n"); } else { printf("The backup register is not cleared when tamper event happen!\r\n"); } /* Retrieve tamper date and time */ rtc_get_tamper_time(RTC, &ul_hour0, &ul_minute0, &ul_second0, 0); rtc_get_tamper_date(RTC, &ul_year0, &ul_month0, &ul_day0, &ul_week0, 0); rtc_get_tamper_time(RTC, &ul_hour1, &ul_minute1, &ul_second1, 1); rtc_get_tamper_date(RTC, &ul_year1, &ul_month1, &ul_day1, &ul_week1, 1); tmp_cnt = rtc_get_tamper_event_counter(RTC); tmp_src0 = rtc_get_tamper_source(RTC, 0); tmp_src1 = rtc_get_tamper_source(RTC, 1); printf("The first tamper event TMP%u happen in %02u:%02u:%02u,%02u/%02u/%04u\r\n", (unsigned int)tmp_src0, (unsigned int)ul_hour0, (unsigned int)ul_minute0, (unsigned int)ul_second0, (unsigned int)ul_month0, (unsigned int)ul_day0, (unsigned int)ul_year0); printf("The last tamper event TMP%u happen in %02u:%02u:%02u,%02u/%02u/%04u\r\n", (unsigned int)tmp_src1, (unsigned int)ul_hour1, (unsigned int)ul_minute1, (unsigned int)ul_second1, (unsigned int)ul_month1, (unsigned int)ul_day1, (unsigned int)ul_year1); printf("The tamper event counter is %u \r\n", (unsigned int)tmp_cnt); } printf("Press any key to Enter Backup Mode!\r\n"); while (uart_read(CONSOLE_UART, &uc_key)); /* Write the data to the backup register GPBR0 ~ 7 */ gpbr_write(GPBR0, GPBR_CONST_DATA); gpbr_write(GPBR1, GPBR_CONST_DATA); gpbr_write(GPBR2, GPBR_CONST_DATA); gpbr_write(GPBR3, GPBR_CONST_DATA); gpbr_write(GPBR4, GPBR_CONST_DATA); gpbr_write(GPBR5, GPBR_CONST_DATA); gpbr_write(GPBR6, GPBR_CONST_DATA); gpbr_write(GPBR7, GPBR_CONST_DATA); /* Enable TMP0 and TMP2 low power debouncer and clear GPBR when event happen */ supc_set_wakeup_mode(SUPC, SUPC_WUMR_LPDBCEN0_ENABLE | SUPC_WUMR_LPDBCCLR_ENABLE | SUPC_WUMR_LPDBCEN2_ENABLE | SUPC_WUMR_LPDBC_2_RTCOUT0); /* Enable TMP0 and TMP2 wake-up input and set input type*/ supc_set_wakeup_inputs(SUPC, SUPC_WUIR_WKUPEN0_ENABLE | SUPC_WUIR_WKUPEN14_ENABLE, SUPC_WUIR_WKUPT0_LOW | SUPC_WUIR_WKUPT14_LOW); printf("Enter Backup Mode!\r\n"); printf("Please press button TMP0 or TMP2 to wake up!\r\n\r\n"); /* Ensure TX is done before enter backup mode */ while (!uart_is_tx_empty(CONSOLE_UART)) { } /* Enter backup mode */ pmc_enable_backupmode(); while (1) { } }
/** * \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(); } } }