打印
[DemoCode下载]

新唐M051 WDT看门狗使用程序

[复制链接]
1205|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wahahaheihei|  楼主 | 2016-8-13 18:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下程序是基于新唐M051单片机而开发的:


/* 看门狗是向上计数的,PWM是向下计数的
看门狗特征:
1)18位自由运行的计数器以防止CPU在延迟时间结束之前发生看门狗定时器复位
2)溢出时间间隔可选(2^4 ~ 2^18),溢出时间范围在104ms~26.3168s(如果WDT_CLK为10KHz)
3)复位周期=(1/10KHz)*63,如果WDT_CLK=10KHz */
#include "WDT.h"
#define DEBUGMSG       printf
void SystemInit(void)
{
  PROTECT_REG
  (
   PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定  
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
   /* 使能内部10K时钟 */
   PWRCON |= OSC10K_EN;
   /* 等待10K时钟稳定 */
   while((CLKSTATUS & OSC10K_STB) == 0);
   /* HCLK时钟选择为外部晶振 */
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;
  )
}
/****************************************
*函数名称:WatchDogInit
*输    入:无
*输    出:无
*功    能:看门狗初始化
******************************************/
VOID WatchDogInit(VOID)
{
PROTECT_REG
(
     /* 使能看门狗时钟 */
  APBCLK |= WDT_CLKEN;
  /* 设置看门狗时钟源为10K */
  CLKSEL1 = (CLKSEL1 & (~WDT_CLK)) | WDT_10K;     
  /* 使能看门狗定时器复位功能 */
  WTCR |= WTRE;
  /* 设置看门狗超时间隔为1740.8ms */
  WTCR &= ~WTIS;
  WTCR |= TO_2T14_CK; //(2^14+1024)*(1000000/10000)=17408*100=1740800us=1.7408s
  /* 使能看门狗中断 */   
  WTCR |= WTIE;
  NVIC_ISER |= WDT_INT;
  /* 使能看门狗 */
  WTCR |= WTE;
  /* 复位看门狗计数值 */
  WTCR |= CLRWTR;  
)
}

/****************************************
*函数名称:WDT_IRQHandler
*输    入:无
*输    出:无
*功    能:看门狗中断服务函数
******************************************/
VOID WDT_IRQHandler(VOID)
{
    DEBUGMSG("WDT Reset \r\n");         //打印复位信息
PROTECT_REG
(
  WTCR |= WTWKF;
  WTCR |= WTIF;
)
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
  SystemInit();
  UartInit(12000000,9600);       //波特率设置为9600bps
  WatchDogInit();            //看门狗初始化
  while(1)
  {
      WTCR |= CLRWTR;                           //喂狗操作
   DEBUGMSG("WDT No Reset \r\n");
   Delayms(50);
    WTCR |= CLRWTR;                           //喂狗操作
   Delayms(50);
    WTCR |= CLRWTR;                           //喂狗操作
   Delayms(50);
    WTCR |= CLRWTR;                           //喂狗操作
   Delayms(50);
  }
}


沙发
gejigeji521| | 2016-8-13 21:46 | 只看该作者
看门狗定时器用于在软件运行至未知状态时执行系统复位功能,可以防止系统无限制地挂机,除此之外,看门狗定时器还可将CPU由掉电模式唤醒。看门狗定时器包含一个18位的自由运行的计数器,可编程其定时溢出间隔.

使用特权

评论回复
板凳
huangcunxiake| | 2016-8-13 23:19 | 只看该作者
一个完美的系统应该有看门狗,要不早晚死机了可咋办。

使用特权

评论回复
地板
玛尼玛尼哄| | 2016-8-14 11:02 | 只看该作者
看门狗用来防止代码死机。软件设定喂狗间隔之后,如果到时间没有喂狗,说明软件跑飞了,这时候看门狗就会复位整个系统,从头重新跑。

使用特权

评论回复
5
玛尼玛尼哄| | 2016-8-14 11:11 | 只看该作者
喂狗间隔由WDT 控制寄存器WTIS决定。 超时时间到, WDT_ISR寄存器的WDT_IS将置为’1’。软
件可以轮询该标志喂狗或者使能WDT中断在中断里面喂狗。一般在主循环里面喂狗,这样主循环
死掉了就会复位。如果在中断里面喂狗,就是程序死的中断都没有了才会复位,例如:发生了
HardFault中断,因为它的优先级比较高,如果没有实现HardFault中断处理函数,默认的HardFault
中断处理函数就是死循环,看门狗的中断没有机会再发生了,就会复位系统。
超时之后, WDT IP会延迟一段时间(复位延迟时间WTRDSEL)等软件喂狗,该时间内没有喂狗,
才会发生复位

使用特权

评论回复
6
zhuomuniao110| | 2016-8-22 21:58 | 只看该作者
一个完美的系统应该有看门狗,要不早晚死机了可咋办。

使用特权

评论回复
7
mintspring| | 2016-8-23 08:42 | 只看该作者
复位周期=(1/10KHz)*63,如果WDT_CLK=10KHz

使用特权

评论回复
8
wahahaheihei|  楼主 | 2016-8-24 01:06 | 只看该作者
如果没有实现HardFault中断处理函数,默认的HardFault
中断处理函数就是死循环

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

216

主题

3027

帖子

12

粉丝