打印

MSP430学习小结-看门狗的使用总结

[复制链接]
10465|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
teabottle|  楼主 | 2011-11-22 23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。在很多单片机中都内置了看门狗,看门狗本身是一个定时器,当定时器溢出时即进行系统复位,因此需要在程序中对看门狗定时器进行清零,即常说的喂狗。
由于我用过AVR的单片机,和AVR的相比,MSP430的看门狗要灵活的多,首先默认看门狗是开着的,因此如果不使用看门狗的话要关闭,指令如下:
WDTCTL = WDTPW + WDTHOLD
如果打开看门狗则需要在程序中清零,指令如下:
WDTCTL=WDTPW+WDTCNTCL
这只是基本的应用,430的看门狗要稍微复杂一些,首先从IAR的头文件中看看定义了几种工作状态:

2.WDT通过SSEL 和IS0 IS1 3位可以确定与8种时钟源相关的时间(ACLK=32768Hz,SMCLK=1MHz)
SMCLK=1MH(对应8种)
WDT_MDLY_32
WDT_MRST_32
WDT_MDLY_8
WDT_MRST_8
WDT_MDLY_0_5
WDT_MRST_0_5
WDT_MDLY_0_064
WDT_MRST_0_064
ACLK=32768Hz(对应8种)
WDT_ADLY_1000
WDT_ARST_1000
WDT_ADLY_250
WDT_ARST_250
WDT_ADLY_16
WDT_ARST_16
WDT_ADLY_1_9
WDT_ARST_1_9

相关帖子

沙发
teabottle|  楼主 | 2011-11-22 23:25 | 只看该作者
在头文件中查得:

            
代码解释:
WDTCTL =[url=]WDT_ARST_1000;[/url]

在头文件中看到WDT_ARST_1000的定义为:([url=]WDTPW+WDTCNTCL+WDTSSEL0+WDTIS2[/url])      
即上一条指令执行的是WDTCTL=
WDTPW+[url=]WDTCNTCL[/url]+WDTSSEL0+WDTIS2。
[url=]WDTCTL[/url]设置每条命令中必有WDTPW+..因为WDTPW代表写WDTCTL的时候高八位写05Ah,读的时候高八位为069h,否则触发PUC。
WDTCNTCL:看门狗计数器清零.
WDTSSEL0:表示WDTSSEL第0位置1,既0001.
WDTIS2: 表示WDTIS2第2位置1,既0100.
设置的含义看MSP4305438 PDF文档

使用特权

评论回复
板凳
teabottle|  楼主 | 2011-11-22 23:26 | 只看该作者
从头文件的定义中可以看出主要有两种方式,一种就是当做普通的定时器使用,一种才是作为看门狗,另外就是时钟源可选,选择8M或者32K的晶振来获得不同的延时,通过上面可以看出看门狗定时器最大的时间可以到1S,在程序中可以灵活的利用看门狗定时器实现想要的功能。
下面介绍两个典型应用:
1、在动态数码管显示中的应用,具体代码可以参考我之前的笔记,部分代码如下:
WDTCTL = WDT_ADLY_1_9;      
//  
设置内部看门狗工作在定时器模式,1.9ms中断一次  
   
//可以去看头文件中具体的配置,这里使用的手表晶振64分频计算可得是1.9ms  
     SFRIE1 |= WDTIE;   
               
// 使能看门狗中断
__interrupt void watchdog_timer(void)  
{
}
这个程序主要是将看门狗定时器当做普通定时器使用,1.9ms刚好适合动态扫描间隔,在看门狗中断中对数码管进行动态扫描,这样使用相对于开一个定时器来说要有所方便。因此在需要的定时与看门狗定时器的几个时间相同时可以考虑使用看门狗。
2、普通延时
WDTCTL = WDT_ADLY_1000;              
//间隔定时器,定时1000ms
//延时2s
   
for(i = 0; i < 3; i++)
   
{
      
IFG1 &= ~WDTIFG;
      
while(!(IFG1 & WDTIFG));
      
IFG1 &= ~WDTIFG;
   
}
这个程序同样是将看门狗当普通定时器使用,在主程序中读取中断标志位,实现延时效果,上面的程序为什么是延时2S自己分析。
这里面举了两个例子,是最近学习的一点小体会,当然还是不能忘了看门狗的本能工作,在程序较为简单时可以考虑使用看门狗定时器简化设计。另外还有一点觉得比较重要的是虽然头文件中对寄存器都有了很好的定义,但是还是很有必要对着头文件和寄存器把主要的寄存器看一面,弄清每一种工作模式的使用方式和注意点。

使用特权

评论回复
地板
tl5324260| | 2011-11-23 11:06 | 只看该作者
看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。   工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。   硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813 ,5045, IMP 813等,价格4~10元不等.   软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的裕量。而T1的中断正常与否我们再由T0定时中断子程序来监视。这样就够成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。   51 系列有专门的看门狗定时器,对系统频率进行分频计数,定时器溢出时,将引起复位.看门狗可设定溢出率,也可单独用来作为定时器使用。   凌阳61的看门狗比较单一,一个是时间单一,第二是功能在实际的使用中只需在循环当中加入清狗的指令就OK了。

使用特权

评论回复
5
tianyu01| | 2011-11-23 13:11 | 只看该作者
过来了解下

使用特权

评论回复
6
tianyu01| | 2011-11-23 13:12 | 只看该作者
:)

使用特权

评论回复
7
teet| | 2011-11-23 13:17 | 只看该作者
看门狗用途很广呢

使用特权

评论回复
8
teet| | 2011-11-23 13:17 | 只看该作者
写的很细 赞一个

使用特权

评论回复
9
jzhjt29| | 2011-11-28 13:27 | 只看该作者

使用特权

评论回复
10
贪狼lyb| | 2013-7-22 21:39 | 只看该作者
看看吧

使用特权

评论回复
11
zjxcml| | 2013-9-16 22:46 | 只看该作者
谢谢,

使用特权

评论回复
12
1988020566| | 2013-9-17 16:00 | 只看该作者
楼主的图片都看不到了

使用特权

评论回复
13
1988020566| | 2013-9-17 16:00 | 只看该作者
应该去掉连接的。

使用特权

评论回复
14
angerbird| | 2013-9-18 01:01 | 只看该作者
MSP430单片机里面关于看门狗的实用,给出的开发指导非常简洁的,实用也很方便的,直接调用就可以了

使用特权

评论回复
15
thankxie| | 2014-3-21 17:42 | 只看该作者
好东西

使用特权

评论回复
16
liuyang8023| | 2014-3-21 20:55 | 只看该作者

使用特权

评论回复
17
火山LF| | 2016-8-5 08:10 | 只看该作者
楼主,为什么是延时2s呢?

WDTCTL = WDT_ADLY_1000;              
//间隔定时器,定时1000ms
//延时2s
   
for(i = 0; i < 3; i++)
   
{
      
IFG1 &= ~WDTIFG;
      
while(!(IFG1 & WDTIFG));
      
IFG1 &= ~WDTIFG;
   
}

for循环走完也要3s吧?

使用特权

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

本版积分规则

97

主题

1441

帖子

1

粉丝