[Atmel] 跑一下SAM4N例程(十一):WDT中断

[复制链接]
1152|0
 楼主| ddllxxrr 发表于 2015-3-12 21:33 | 显示全部楼层 |阅读模式
打开WDT例程很方使,可以在有开发板和无开发板的情况下都可以打开。

以下是打开后的截图:



这个例程是这样,先配置好串口和看门狗定时及LED管脚定义。

  1. /**
  2. *  \brief Handler for System Tick interrupt.
  3. */
  4. void SysTick_Handler(void)
  5. {
  6.         /* Set systick event flag (g_b_systick_event) and add 1 to systick. */
  7.         g_b_systick_event = true;
  8.         g_ul_ms_ticks++;
  9. }

  10. /**
  11. *  \brief Handler for watchdog interrupt.
  12. */
  13. void WDT_Handler(void)
  14. {
  15.         puts("Enter watchdog interrupt.\r");

  16.         /* Clear status bit to acknowledge interrupt by dummy read. */
  17.         wdt_get_status(WDT);
  18.         /* Restart the WDT counter. */
  19.         wdt_restart(WDT);
  20.         puts("The watchdog timer was restarted.\r");
  21. }

  22. /**
  23. *  \brief Handler for Button 1 rising edge interrupt.
  24. */
  25. static void button_handler(uint32_t id, uint32_t mask)
  26. {
  27.         /* Set button event flag (g_b_button_event). */
  28.         if ((PUSHBUTTON_ID == id) && (PUSHBUTTON_MASK == mask)) {
  29.                 g_b_button_event = true;
  30.         }
  31. }

  32. /**
  33. *  \brief Configure the Console UART.
  34. */
  35. static void configure_console(void)
  36. {
  37.         const usart_serial_options_t uart_serial_options = {
  38.                 .baudrate = CONF_UART_BAUDRATE,
  39. #ifdef CONF_UART_CHAR_LENGTH
  40.                 .charlength = CONF_UART_CHAR_LENGTH,
  41. #endif
  42.                 .paritytype = CONF_UART_PARITY,
  43. #ifdef CONF_UART_STOP_BITS
  44.                 .stopbits = CONF_UART_STOP_BITS,
  45. #endif
  46.         };

  47.         /* Configure console UART. */
  48.         sysclk_enable_peripheral_clock(CONSOLE_UART_ID);
  49.         stdio_serial_init(CONF_UART, &uart_serial_options);
  50. }

  51. /**
  52. *  \brief Configure the Pushbutton.
  53. */
  54. static void configure_button(void)
  55. {
  56.         /* Enable the peripheral clock for the push button on board. */
  57.         pmc_enable_periph_clk(PUSHBUTTON_ID);

  58.         /* Configure PIOs as input pins. */
  59.         pio_configure(PUSHBUTTON_PIO, PUSHBUTTON_TYPE, PUSHBUTTON_MASK,
  60.                         PUSHBUTTON_ATTR);

  61.         /* Adjust PIO debounce filter parameters. */
  62.         pio_set_debounce_filter(PUSHBUTTON_PIO, PUSHBUTTON_MASK,
  63.                         PUSHBUTTON_FILTER_GLITCH_VAULE);

  64.         /* Initialize PIO interrupt handler, interrupt on rising edge. */
  65.         pio_handler_set(PUSHBUTTON_PIO, PUSHBUTTON_ID, PUSHBUTTON_MASK,
  66.                         PUSHBUTTON_ATTR, button_handler);
  67. }

  68. /**
  69. *  \brief Configure LED.
  70. */
  71. static void configure_led(void)
  72. {
  73.         /* Configure PIOs for LED. */
  74.         pio_configure(LED_PIO, LED_TYPE, LED_MASK, LED_ATTR);
  75. }



然后正常喂狗
  1. /* Restart watchdog at the given period. */
  2.                         if ((g_ul_ms_ticks % WDT_RESTART_PERIOD) == 0) {
  3.                                 wdt_restart(WDT);
  4.                         }




当有用户按键时,这时就破坏了喂狗,这时转向看门狗的中断程序。

  1. /* Simulate deadlock when button is pressed. */
  2.                 if (g_b_button_event == true) {
  3.                         puts("Program enters infinite loop for triggering watchdog interrupt.\r");
  4.                         while (1) {
  5.                         }
  6.                 }
最后进入看门狗中断程序:

  1. */
  2. void WDT_Handler(void)
  3. {
  4.         puts("Enter watchdog interrupt.\r");

  5.         /* Clear status bit to acknowledge interrupt by dummy read. */
  6.         wdt_get_status(WDT);
  7.         /* Restart the WDT counter. */
  8.         wdt_restart(WDT);
  9.         puts("The watchdog timer was restarted.\r");
  10. }


本帖子中包含更多资源

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

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

本版积分规则

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

2404

主题

7001

帖子

68

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