跑一下SAM4N例程(十九):复位测试

[复制链接]
906|0
 楼主| ddllxxrr 发表于 2015-4-2 21:37 | 显示全部楼层 |阅读模式
在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.


主程序:在循环检测

  1.         while (1) {
  2.                 /* Wait for a key press or reset IRQ to trigger. */
  3.                 while (uart_read(CONSOLE_UART, &uc_key) && (!reset_interrupt_triggered));
  4.                
  5.                 //! [reset_irq_has_triggered]
  6.                 if (reset_interrupt_triggered) {
  7.                         /* Critical section to access a variable that is set in an IRQ. */
  8.                         cpu_irq_enter_critical();
  9.                         reset_interrupt_triggered = false;
  10.                         cpu_irq_leave_critical();
  11.                        
  12.                         puts("User Reset IRQ triggered. Press any console key for the menu\r");
  13.                 }
  14.                 //! [reset_irq_has_triggered]
  15.                 else {
  16.                         /* Act on the key press. */
  17.                         switch (uc_key - '0') {
  18.                         case 0: /* Display reset information. */
  19.                                 display_reset_reason();
  20.                         break;
  21.                        
  22.                         case 1:        /* Enable User Reset. */
  23.                                 //! [reset_enable_user_reset]
  24.                                 rstc_enable_user_reset(RSTC);
  25.                                 //! [reset_enable_user_reset]
  26.                                 puts("User Reset enabled - Press evaluation kit RESET button to test.\r");
  27.                         break;
  28.                
  29.                         case 2:        /* Disable User Reset. */
  30.                                 //! [reset_disable_user_reset]
  31.                                 rstc_disable_user_reset(RSTC);
  32.                                 //! [reset_disable_user_reset]
  33.                                 puts("User Reset disabled  - Press evaluation kit RESET button to test.\r");
  34.                         break;
  35.        
  36.                         case 3: /* User Reset interrupt enable. */
  37.                                 reset_interrupt_triggered = false;
  38.                        
  39.                                 /* Configure and enable WDT interrupt. */
  40.                                 //! [reset_enable_user_reset_interrupt]
  41.                                 rstc_disable_user_reset(RSTC);
  42.                                 NVIC_DisableIRQ(RSTC_IRQn);
  43.                                 rstc_enable_user_reset_interrupt(RSTC);
  44.                                 NVIC_ClearPendingIRQ(RSTC_IRQn);
  45.                                 NVIC_SetPriority(RSTC_IRQn, 0);
  46.                                 NVIC_EnableIRQ(RSTC_IRQn);
  47.                                 //! [reset_enable_user_reset_interrupt]
  48.                        
  49.                                 puts("User Reset interrupt enabled.\r");
  50.                         break;

  51.                         case 4: /* User Reset interrupt disable. */
  52.                                 //! [reset_disable_user_reset_interrupt]
  53.                                 NVIC_DisableIRQ(RSTC_IRQn);
  54.                                 rstc_disable_user_reset_interrupt(RSTC);
  55.                                 rstc_enable_user_reset(RSTC);
  56.                                 //! [reset_disable_user_reset_interrupt]
  57.                                
  58.                                 puts("User Reset interrupt disabled.\r");
  59.                         break;
  60.                
  61.                         case 5:        /* Software Reset. */
  62.                                 puts("Software Reset activated.\r");                               
  63.                                 wait_for_message_gone();
  64.                                
  65.                                 rstc_start_software_reset(RSTC);
  66.                                
  67.                                 /* Spin. */
  68.                                 while (1);
  69.                         break;
  70.                
  71.                         case 6:        /* Watchdog Reset. */
  72.                                 configure_watchdog();
  73.                                
  74.                                 /* Stop tickling the watchdog. */
  75.                                 watchdog_enabled = false;
  76.                                
  77.                                 puts("Watchdog Reset will trigger in 3 seconds.\r\n\r");
  78.                                
  79.                                 /* Spin. */
  80.                                 while (1);
  81.                         break;
  82.                
  83.                         case 7:        /* NRST assert. */
  84.                                 puts("NRST asserted.\r");
  85.                                
  86.                                 //! [reset_assert_nrst]
  87.                                 rstc_set_external_reset(RSTC, 0);        /* 60us */
  88.                                 rstc_reset_extern(RSTC);
  89.                                 //! [reset_assert_nrst]
  90.                         break;
  91.                
  92.                         default:
  93.                                 puts("Invalid menu option!\r");
  94.                         }       
  95.                        
  96.                 /* Display the menu. */
  97.                 display_menu();
  98.                 }



以下是显示复位原因:

  1. static void display_reset_reason(void)
  2. {
  3.         char msg[80];
  4.        
  5.         strcpy(&msg[0], "\r\nReset info : ");
  6.        
  7.         //! [reset_get_status]
  8.         uint32_t info = rstc_get_status(RSTC);
  9.         //! [reset_get_status]
  10.        
  11.         /* Decode the reset reason. */
  12.         switch (info & RSTC_SR_RSTTYP_Msk) {       
  13.         case RSTC_GENERAL_RESET:
  14.                 strcat(&msg[0], "General Reset,");
  15.         break;
  16.        
  17.         case RSTC_BACKUP_RESET:
  18.                 strcat(&msg[0], "Backup Reset,");
  19.         break;
  20.        
  21.         case RSTC_WATCHDOG_RESET:
  22.                 strcat(&msg[0], "Watchdog Reset,");
  23.         break;
  24.        
  25.         case RSTC_SOFTWARE_RESET:
  26.                 strcat(&msg[0], "Software Reset,");
  27.         break;
  28.        
  29.         case RSTC_USER_RESET:
  30.                 strcat(&msg[0], "User Reset,");
  31.         break;
  32.        
  33.         default:
  34.                 strcat(&msg[0], "Invalid reset reason!,");
  35.         }
  36.        
  37.         /* NRST level. */
  38.         if (info & RSTC_SR_NRSTL) {
  39.                 strcat(&msg[0], " NRST=1,");
  40.         }
  41.         else {
  42.                 strcat(&msg[0], " NRST=0,");
  43.         }

  44.         /* User reset status. */
  45.         if (info & RSTC_SR_URSTS) {
  46.                 strcat(&msg[0], " User Reset=1\r");
  47.         }
  48.         else {
  49.                 strcat(&msg[0], " User Reset=0\r");
  50.         }

  51.         puts(&msg[0]);
  52. }
strcpy(&msg[0], "\r\nReset info : ");是把后边的字符考到&msg[0]中,然后strcat是合并字符串。就是把前后两串字符合到一起。


以下是运行结果:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部