在Atmel Studio6.2开发环境下,很容易打开SAM4N复位例程。
这个例程是测试各种复位源的,在重启开发板时显示上次是哪个复位源复位的。
以下是本例的菜单:
Menu:
0 - Reset Status information.
1 - User Reset enable.
2 - User Reset disable.
3 - User Reset interrupt enable.
4 - User Reset interrupt disable.
5 - Software Reset.
6 - Watchdog Reset.
7 - NRST assert.
主程序:在循环检测
- while (1) {
- /* Wait for a key press or reset IRQ to trigger. */
- while (uart_read(CONSOLE_UART, &uc_key) && (!reset_interrupt_triggered));
-
- //! [reset_irq_has_triggered]
- if (reset_interrupt_triggered) {
- /* Critical section to access a variable that is set in an IRQ. */
- cpu_irq_enter_critical();
- reset_interrupt_triggered = false;
- cpu_irq_leave_critical();
-
- puts("User Reset IRQ triggered. Press any console key for the menu\r");
- }
- //! [reset_irq_has_triggered]
- else {
- /* Act on the key press. */
- switch (uc_key - '0') {
- case 0: /* Display reset information. */
- display_reset_reason();
- break;
-
- case 1: /* Enable User Reset. */
- //! [reset_enable_user_reset]
- rstc_enable_user_reset(RSTC);
- //! [reset_enable_user_reset]
- puts("User Reset enabled - Press evaluation kit RESET button to test.\r");
- break;
-
- case 2: /* Disable User Reset. */
- //! [reset_disable_user_reset]
- rstc_disable_user_reset(RSTC);
- //! [reset_disable_user_reset]
- puts("User Reset disabled - Press evaluation kit RESET button to test.\r");
- break;
-
- case 3: /* User Reset interrupt enable. */
- reset_interrupt_triggered = false;
-
- /* Configure and enable WDT interrupt. */
- //! [reset_enable_user_reset_interrupt]
- rstc_disable_user_reset(RSTC);
- NVIC_DisableIRQ(RSTC_IRQn);
- rstc_enable_user_reset_interrupt(RSTC);
- NVIC_ClearPendingIRQ(RSTC_IRQn);
- NVIC_SetPriority(RSTC_IRQn, 0);
- NVIC_EnableIRQ(RSTC_IRQn);
- //! [reset_enable_user_reset_interrupt]
-
- puts("User Reset interrupt enabled.\r");
- break;
- case 4: /* User Reset interrupt disable. */
- //! [reset_disable_user_reset_interrupt]
- NVIC_DisableIRQ(RSTC_IRQn);
- rstc_disable_user_reset_interrupt(RSTC);
- rstc_enable_user_reset(RSTC);
- //! [reset_disable_user_reset_interrupt]
-
- puts("User Reset interrupt disabled.\r");
- break;
-
- case 5: /* Software Reset. */
- puts("Software Reset activated.\r");
- wait_for_message_gone();
-
- rstc_start_software_reset(RSTC);
-
- /* Spin. */
- while (1);
- break;
-
- case 6: /* Watchdog Reset. */
- configure_watchdog();
-
- /* Stop tickling the watchdog. */
- watchdog_enabled = false;
-
- puts("Watchdog Reset will trigger in 3 seconds.\r\n\r");
-
- /* Spin. */
- while (1);
- break;
-
- case 7: /* NRST assert. */
- puts("NRST asserted.\r");
-
- //! [reset_assert_nrst]
- rstc_set_external_reset(RSTC, 0); /* 60us */
- rstc_reset_extern(RSTC);
- //! [reset_assert_nrst]
- break;
-
- default:
- puts("Invalid menu option!\r");
- }
-
- /* Display the menu. */
- display_menu();
- }
以下是显示复位原因:
- static void display_reset_reason(void)
- {
- char msg[80];
-
- strcpy(&msg[0], "\r\nReset info : ");
-
- //! [reset_get_status]
- uint32_t info = rstc_get_status(RSTC);
- //! [reset_get_status]
-
- /* Decode the reset reason. */
- switch (info & RSTC_SR_RSTTYP_Msk) {
- case RSTC_GENERAL_RESET:
- strcat(&msg[0], "General Reset,");
- break;
-
- case RSTC_BACKUP_RESET:
- strcat(&msg[0], "Backup Reset,");
- break;
-
- case RSTC_WATCHDOG_RESET:
- strcat(&msg[0], "Watchdog Reset,");
- break;
-
- case RSTC_SOFTWARE_RESET:
- strcat(&msg[0], "Software Reset,");
- break;
-
- case RSTC_USER_RESET:
- strcat(&msg[0], "User Reset,");
- break;
-
- default:
- strcat(&msg[0], "Invalid reset reason!,");
- }
-
- /* NRST level. */
- if (info & RSTC_SR_NRSTL) {
- strcat(&msg[0], " NRST=1,");
- }
- else {
- strcat(&msg[0], " NRST=0,");
- }
- /* User reset status. */
- if (info & RSTC_SR_URSTS) {
- strcat(&msg[0], " User Reset=1\r");
- }
- else {
- strcat(&msg[0], " User Reset=0\r");
- }
- puts(&msg[0]);
- }
-
strcpy(&msg[0], "\r\nReset info : ");是把后边的字符考到&msg[0]中,然后strcat是合并字符串。就是把前后两串字符合到一起。
以下是运行结果:
|