[DemoCode下载] M051 WDT看门狗

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

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


稳稳の幸福 发表于 2016-1-20 19:57 | 显示全部楼层
没看到有触发溢出的动作啊,比如弄个按键等待。
玛尼玛尼哄 发表于 2016-1-20 20:42 | 显示全部楼层
*函数名称:WDT_IRQHandler
*输    入:无
*输    出:无
*功    能:看门狗中断服务函数
******************************************/
VOID WDT_IRQHandler(VOID)
{
    DEBUGMSG("WDT Reset \r\n");         //打印复位信息
PROTECT_REG
(
  WTCR |= WTWKF;
  WTCR |= WTIF;
)
}
这个中断是干啥用
Tennasi 发表于 2016-1-21 08:54 | 显示全部楼层
玛尼玛尼哄 发表于 2016-1-20 20:42
*函数名称:WDT_IRQHandler
*输    入:无
*输    出:无

是不是有问题了会来一次中断呢
_寒寒_ 发表于 2016-1-21 14:06 | 显示全部楼层
Tennasi 发表于 2016-1-21 08:54
是不是有问题了会来一次中断呢

是,可以在中断里面把中断前的PC发出去,方便定位问题
玛尼玛尼哄 发表于 2016-1-22 11:01 | 显示全部楼层
Tennasi 发表于 2016-1-21 08:54
是不是有问题了会来一次中断呢

这个应该是中断后的处理函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

85

帖子

5

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