[DemoCode下载] 新唐M051 WDT看门狗使用程序

[复制链接]
 楼主| ccw1986 发表于 2015-8-3 21:30 | 显示全部楼层 |阅读模式
/* 看门狗是向上计数的,PWM是向下计数的
看门狗特征:
1)18位自由运行的计数器以防止CPU在延迟时间结束之前发生看门狗定时器复位
2)溢出时间间隔可选(2^4 ~ 2^18),溢出时间范围在104ms~26.3168s(如果WDT_CLK为10KHz)
3)复位周期=(1/10KHz)*63,如果WDT_CLK=10KHz */
  1. #include "WDT.h"
  2. #define DEBUGMSG       printf
  3. void SystemInit(void)
  4. {
  5.   PROTECT_REG
  6.   (
  7.    PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
  8.    while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定  
  9.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
  10.    /* 使能内部10K时钟 */
  11.    PWRCON |= OSC10K_EN;
  12.    /* 等待10K时钟稳定 */
  13.    while((CLKSTATUS & OSC10K_STB) == 0);
  14.    /* HCLK时钟选择为外部晶振 */
  15.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;
  16.   )
  17. }
  18. /****************************************
  19. *函数名称:WatchDogInit
  20. *输    入:无
  21. *输    出:无
  22. *功    能:看门狗初始化
  23. ******************************************/
  24. VOID WatchDogInit(VOID)
  25. {
  26. PROTECT_REG
  27. (
  28.      /* 使能看门狗时钟 */
  29.   APBCLK |= WDT_CLKEN;
  30.   /* 设置看门狗时钟源为10K */
  31.   CLKSEL1 = (CLKSEL1 & (~WDT_CLK)) | WDT_10K;     
  32.   /* 使能看门狗定时器复位功能 */
  33.   WTCR |= WTRE;
  34.   /* 设置看门狗超时间隔为1740.8ms */
  35.   WTCR &= ~WTIS;
  36.   WTCR |= TO_2T14_CK; //(2^14+1024)*(1000000/10000)=17408*100=1740800us=1.7408s
  37.   /* 使能看门狗中断 */   
  38.   WTCR |= WTIE;
  39.   NVIC_ISER |= WDT_INT;
  40.   /* 使能看门狗 */
  41.   WTCR |= WTE;
  42.   /* 复位看门狗计数值 */
  43.   WTCR |= CLRWTR;  
  44. )
  45. }

  46. /****************************************
  47. *函数名称:WDT_IRQHandler
  48. *输    入:无
  49. *输    出:无
  50. *功    能:看门狗中断服务函数
  51. ******************************************/
  52. VOID WDT_IRQHandler(VOID)
  53. {
  54.     DEBUGMSG("WDT Reset \r\n");         //打印复位信息
  55. PROTECT_REG
  56. (
  57.   WTCR |= WTWKF;
  58.   WTCR |= WTIF;
  59. )
  60. }
  61. /****************************************
  62. *函数名称:main
  63. *输    入:无
  64. *输    出:无
  65. *功    能:函数主体
  66. ******************************************/
  67. INT32 main(VOID)
  68. {
  69.   SystemInit();
  70.   UartInit(12000000,9600);       //波特率设置为9600bps
  71.   WatchDogInit();            //看门狗初始化
  72.   while(1)
  73.   {
  74.       WTCR |= CLRWTR;                           //喂狗操作
  75.    DEBUGMSG("WDT No Reset \r\n");
  76.    Delayms(50);
  77.     WTCR |= CLRWTR;                           //喂狗操作
  78.    Delayms(50);
  79.     WTCR |= CLRWTR;                           //喂狗操作
  80.    Delayms(50);
  81.     WTCR |= CLRWTR;                           //喂狗操作
  82.    Delayms(50);
  83.   }
  84. }




643757107 发表于 2015-8-4 09:20 | 显示全部楼层
感觉看门狗初始化的好复杂啊。
Messi1999 发表于 2015-8-4 20:15 | 显示全部楼层
18位自由运行的计数器以防止CPU在延迟时间结束之前发生看门狗定时器复位。
看门狗确实非常有必要,否则程序运行就不稳定了
598330983 发表于 2015-8-4 20:53 | 显示全部楼层
这个直接封装为一个带参函数就爽了,通过参数告诉函数,延时多少的喂狗。
春风的暖暖 发表于 2015-8-4 21:45 | 显示全部楼层
溢出时间间隔可选(2^4 ~ 2^18),溢出时间范围在104ms~26.3168s(如果WDT_CLK为10KHz)。
这一条非常的重要
leeshineSZ 发表于 2016-3-16 17:44 | 显示全部楼层
好定西,mark
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

925

帖子

6

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

84

主题

925

帖子

6

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