查看: 139|回复: 4
收起左侧

[DemoCode下载] 看门狗定时器作为定时器超时中断使用

[复制链接]

46

主题

1631

帖子

4876

积分

中级工程师

 楼主| 发表于 2017-7-11 21:30 | 显示全部楼层 |返回版面|阅读模式
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 2 $
  5. * $Date: 14/01/28 11:45a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    M051 Series WDT Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "M051Series.h"

  13. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  14. #define PLL_CLOCK           50000000


  15. /*---------------------------------------------------------------------------------------------------------*/
  16. /* Global Interface Variables Declarations                                                                 */
  17. /*---------------------------------------------------------------------------------------------------------*/
  18. extern int IsDebugFifoEmpty(void);
  19. volatile uint8_t g_u8IsWDTTimeoutINT = 0;


  20. /**
  21. * @brief       IRQ Handler for WDT and WWDT Interrupt
  22. *
  23. * @param       None
  24. *
  25. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  26. *
  27. * [url=home.php?mod=space&uid=1543424]@Details[/url]     The WDT_IRQHandler is default IRQ of WDT and WWDT, declared in startup_M051Series.s.
  28. */
  29. void WDT_IRQHandler(void)
  30. {
  31.     if(WDT_GET_TIMEOUT_INT_FLAG() == 1)
  32.     {
  33.         /* Clear WDT time-out interrupt flag */
  34.         WDT_CLEAR_TIMEOUT_INT_FLAG();

  35.         g_u8IsWDTTimeoutINT = 1;
  36.     }
  37. }

  38. void SYS_Init(void)
  39. {
  40.     /*---------------------------------------------------------------------------------------------------------*/
  41.     /* Init System Clock                                                                                       */
  42.     /*---------------------------------------------------------------------------------------------------------*/
  43.     /* Enable IRC22M clock */
  44.     CLK->PWRCON |= CLK_PWRCON_IRC22M_EN_Msk;

  45.     /* Waiting for IRC22M clock ready */
  46.     CLK_WaitClockReady(CLK_CLKSTATUS_IRC22M_STB_Msk);

  47.     /* Switch HCLK clock source to HIRC */
  48.     CLK->CLKSEL0 = CLK_CLKSEL0_HCLK_S_HIRC;

  49.     /* Set PLL to Power-down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
  50.     CLK->PLLCON |= CLK_PLLCON_PD_Msk;

  51.     /* Enable external 12 MHz XTAL, IRC 10 kHz */
  52.     CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC10K_EN_Msk;

  53.     /* Enable PLL and Set PLL frequency */
  54.     CLK->PLLCON = PLLCON_SETTING;

  55.     /* Waiting for clock ready */
  56.     CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_IRC10K_STB_Msk);

  57.     /* Switch HCLK clock source to PLL, STCLK to HCLK/2 */
  58.     CLK->CLKSEL0 = CLK_CLKSEL0_STCLK_S_HCLK_DIV2 | CLK_CLKSEL0_HCLK_S_PLL;

  59.     /* Enable peripheral clock */
  60.     CLK->APBCLK = CLK_APBCLK_UART0_EN_Msk | CLK_APBCLK_WDT_EN_Msk;

  61.     /* Peripheral clock source */
  62.     CLK->CLKSEL1 = CLK_CLKSEL1_UART_S_PLL | CLK_CLKSEL1_WDT_S_LIRC;

  63.     /* Update System Core Clock */
  64.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  65.     SystemCoreClockUpdate();

  66.     /*---------------------------------------------------------------------------------------------------------*/
  67.     /* Init I/O Multi-function                                                                                 */
  68.     /*---------------------------------------------------------------------------------------------------------*/
  69.     /* Set P3 multi-function pins for UART0 RXD, TXD */
  70.     SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;
  71. }

  72. void UART0_Init(void)
  73. {
  74.     /*---------------------------------------------------------------------------------------------------------*/
  75.     /* Init UART                                                                                               */
  76.     /*---------------------------------------------------------------------------------------------------------*/
  77.     /* Reset IP */
  78.     SYS_ResetModule(UART0_RST);

  79.     /* Configure UART0 and set UART0 Baudrate */
  80.     UART_Open(UART0, 115200);
  81. }

  82. /*---------------------------------------------------------------------------------------------------------*/
  83. /*  MAIN function                                                                                          */
  84. /*---------------------------------------------------------------------------------------------------------*/
  85. int main(void)
  86. {
  87.     uint32_t u32IntCnts = 0;

  88.     /* Unlock protected registers */
  89.     SYS_UnlockReg();

  90.     /* Init System, peripheral clock and multi-function I/O */
  91.     SYS_Init();

  92.     /* Lock protected registers */
  93.     SYS_LockReg();

  94.     /* Init UART0 for printf */
  95.     UART0_Init();

  96.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
  97.     printf("+---------------------------------------+\n");
  98.     printf("|    WDT Time-out Period Sample Code    |\n");
  99.     printf("+---------------------------------------+\n\n");

  100.     printf("# WDT Settings:\n");
  101.     printf("  Clock source is 10 kHz; Enable interrupt; Time-out interval is 2^14 * WDT clock.\n");
  102.     printf("# When WDT statr counting, system will generate a WDT time-out interrupt after 1.6384 ~ 1.7408 s.\n");
  103.     printf("  Measure P0.0 period time to check time-out interval.\n\n");

  104.     /* Use P0.0 to check time-out period time */
  105.     GPIO_SetMode(P0, 0, GPIO_PMD_OUTPUT);
  106.     P00 = 1;
  107.     P00 = 0;

  108.     /* Because of all bits can be written in WDT Control Register are write-protected;
  109.        To program it needs to disable register protection first. */
  110.     SYS_UnlockReg();

  111.     /* Select WDT time-out interval to 2^14 * WDT clock then start WDT counting */
  112.     g_u8IsWDTTimeoutINT = 0;
  113.     WDT_Open(WDT_TIMEOUT_2POW14, WDT_RESET_DELAY_3CLK, FALSE, FALSE);

  114.     /* Enable WDT interrupt function */
  115.     WDT_EnableInt();

  116.     /* Enable WDT NVIC */
  117.     NVIC_EnableIRQ(WDT_IRQn);

  118.     while(1)
  119.     {
  120.         /* Check if WDT time-out interrupt occurred or not */
  121.         while(g_u8IsWDTTimeoutINT == 0);

  122.         g_u8IsWDTTimeoutINT = 0;
  123.         P00 ^= 1;

  124.         printf("WDT time-out interrupt occurred. INT counts: %d      \r", ++u32IntCnts);
  125.     }
  126. }

  127. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
复制代码


50

主题

1186

帖子

3553

积分

中级工程师

发表于 2017-7-11 21:44 | 显示全部楼层 |返回版面
其实看门狗是可以作为普通的定时器使用的。非常棒。

86

主题

3613

帖子

1万

积分

资深工程师

发表于 2017-7-12 19:25 | 显示全部楼层 |返回版面
长长的配置,让我头疼不已。

55

主题

1467

帖子

4413

积分

中级工程师

发表于 2017-7-12 19:41 | 显示全部楼层 |返回版面
可以在缺少定时器时候,又不用看门狗的情况下使用。

32

主题

776

帖子

2323

积分

初级工程师

发表于 2017-7-17 22:08 | 显示全部楼层 |返回版面
没这么用过看看。
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

分享 快速回复 返回顶部 返回列表