[DemoCode下载] 周期性的看门狗定时器(WDT)超时中断

[复制链接]
1481|8
 楼主| xixi2017 发表于 2024-2-25 12:53 | 显示全部楼层 |阅读模式
  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: 4 $
  5. * $Date: 15/09/14 4:05p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Implement periodic WDT time-out interrupt event.
  7. * @note
  8. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  9. ******************************************************************************/
  10. #include <stdio.h>
  11. #include "M058S.h"

  12. #define PLL_CLOCK           50000000


  13. /*---------------------------------------------------------------------------------------------------------*/
  14. /* Global Interface Variables Declarations                                                                 */
  15. /*---------------------------------------------------------------------------------------------------------*/
  16. volatile uint8_t g_u8IsWDTTimeoutINT = 0;


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

  32.         g_u8IsWDTTimeoutINT = 1;
  33.     }
  34. }

  35. void SYS_Init(void)
  36. {
  37.     /*---------------------------------------------------------------------------------------------------------*/
  38.     /* Init System Clock                                                                                       */
  39.     /*---------------------------------------------------------------------------------------------------------*/
  40.     /* Enable HIRC 22.1184MHz clock */
  41.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  42.     /* Waiting for HIRC clock ready */
  43.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  44.     /* Switch HCLK clock source to HIRC and HCLK source divide 1 */
  45.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  46.     /* Enable external XTAL 12MHz and LIRC 10KHz clock */
  47.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC10K_EN_Msk);

  48.     /* Waiting for external XTAL and LIRC clock ready */
  49.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_OSC10K_STB_Msk);

  50.     /* Set core clock as PLL_CLOCK from PLL */
  51.     CLK_SetCoreClock(PLL_CLOCK);

  52.     /* Enable peripheral clock */
  53.     CLK_EnableModuleClock(UART0_MODULE);
  54.     CLK_EnableModuleClock(WDT_MODULE);

  55.     /* Peripheral clock source */
  56.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));
  57.     CLK_SetModuleClock(WDT_MODULE, CLK_CLKSEL1_WDT_S_LIRC, 0);

  58.     /*---------------------------------------------------------------------------------------------------------*/
  59.     /* Init I/O Multi-function                                                                                 */
  60.     /*---------------------------------------------------------------------------------------------------------*/
  61.     /* Set P3 multi-function pins for UART0 RXD, TXD */
  62.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  63.     SYS->P3_MFP |= (SYS_MFP_P30_RXD | SYS_MFP_P31_TXD);
  64. }

  65. void UART0_Init(void)
  66. {
  67.     /*---------------------------------------------------------------------------------------------------------*/
  68.     /* Init UART                                                                                               */
  69.     /*---------------------------------------------------------------------------------------------------------*/
  70.     /* Reset IP */
  71.     SYS_ResetModule(UART0_RST);

  72.     /* Configure UART0 and set UART0 Baudrate */
  73.     UART_Open(UART0, 115200);
  74. }

  75. /*---------------------------------------------------------------------------------------------------------*/
  76. /*  MAIN function                                                                                          */
  77. /*---------------------------------------------------------------------------------------------------------*/
  78. int main(void)
  79. {
  80.     uint32_t u32IntCnts = 0;

  81.     /* Unlock protected registers */
  82.     SYS_UnlockReg();

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

  85.     /* Init UART0 for printf */
  86.     UART0_Init();

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

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

  95.     /* Use P0.0 to check time-out period time */
  96.     GPIO_SetMode(P0, BIT0, GPIO_PMD_OUTPUT);
  97.     P00 = 1;
  98.     P00 = 0;

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

  102.     /* Select WDT time-out interval to 2^14 * WDT clock then start WDT counting */
  103.     g_u8IsWDTTimeoutINT = 0;
  104.     WDT_Open(WDT_TIMEOUT_2POW14, 0, FALSE, FALSE);

  105.     /* Enable WDT interrupt function */
  106.     WDT_EnableInt();

  107.     /* Enable WDT NVIC */
  108.     NVIC_EnableIRQ(WDT_IRQn);

  109.     while(1)
  110.     {
  111.         /* Check if WDT time-out interrupt occurred or not */
  112.         while(g_u8IsWDTTimeoutINT == 0);

  113.         g_u8IsWDTTimeoutINT = 0;
  114.         P00 ^= 1;

  115.         printf("WDT time-out interrupt occurred. INT counts: %d      \r", ++u32IntCnts);
  116.     }
  117. }

  118. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/


 楼主| xixi2017 发表于 2024-2-25 12:53 | 显示全部楼层
这个程序设计用于微控制器(具体来说是M058S)实现周期性的看门狗定时器(WDT)超时中断事件。让我们逐步分析其关键组成部分和功能:

包含和定义:

程序包含了必要的头文件,如stdio.h和"M058S.h"。
定义了PLL_CLOCK为50,000,000,表示PLL时钟频率。
全局变量:

g_u8IsWDTTimeoutINT是一个volatile变量,用作标志,指示WDT超时中断是否发生。
WDT中断处理程序:

WDT_IRQHandler是WDT模块的中断服务例程。它清除WDT超时中断标志,并设置g_u8IsWDTTimeoutINT标志以指示中断发生。
系统初始化:

SYS_Init初始化系统时钟,启用HIRC(高速内部RC)时钟,外部XTAL(晶振)12MHz和LIRC(低速内部RC)10KHz时钟。它配置PLL时钟并启用UART0和WDT模块的时钟。它还配置了UART0 RXD和TXD的I/O多功能引脚。
UART初始化:

UART0_Init初始化UART0,用于与波特率115200进行通信。
主函数:

main函数开始时解锁受保护的寄存器,并初始化系统、时钟和UART0。
它配置并打印有关WDT设置及其超时间隔的信息。
将P0.0设置为输出引脚以检查超时周期时间。
禁用寄存器保护以编程WDT控制寄存器。
将WDT超时间隔配置为2^14 * WDT时钟,并启动WDT计数。
启用WDT中断、WDT的NVIC(嵌套向量中断控制器),并进入循环。
在循环内部,它等待直到WDT超时中断发生,切换P0.0引脚,并递增中断计数。
中断计数不断打印以指示WDT超时中断的发生。
 楼主| xixi2017 发表于 2024-2-25 12:53 | 显示全部楼层
总体而言,该程序建立了周期性的WDT超时中断,并在中断服务例程中处理其发生,同时通过UART通信提供相关信息。
wanduzi 发表于 2024-2-25 19:22 | 显示全部楼层
很多人不用看门狗。
wanduzi 发表于 2024-2-25 19:23 | 显示全部楼层
但是想让系统在死机后能自动复位,就需要看门狗,启用了,才能增强系统的可靠性。
598330983 发表于 2024-2-28 22:30 | 显示全部楼层
作为定时器的中断使用,这个会触发复位吗,应该不会吧。
MCUmaker1984 发表于 2024-2-29 11:03 | 显示全部楼层
请问一下 喂狗是在哪里体现的?
ClarkLLOTP 发表于 2024-3-5 16:32 来自手机 | 显示全部楼层
不用看门狗程序跑飞了咋整
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

2034

帖子

2

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