历史上的今天
今天是:2025年03月31日(星期一)
2020年03月31日 | MSP430使用指南8 -> WDT看门狗模块
2020-03-31 来源:eefocus
看门狗WDT电路在平时调试过程中使用并不多,但在真正产品应用上,可以说每一个系统都会使用看门狗,其主要功能和作用如下:
看门狗电路基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时器将溢出,并将进入中断。在定时器中断中执行一些复位操作。
使系统恢复正常的工作状态,即在程序没有正常运行期间,如期复位看门狗以保证所选择的定时溢出归零,使处理器重新启动。看门狗电路的定时时间长短可由具体应用程序的循环周期决定,通常比系统正常工作时最大循环周期的时间略长即可。
MSP430 MCU内部直接集成了看门狗模块,可以通过用户的设置进行对程序是否跑死进行监控,同时可以通过寄存器配置成两种模式,使得客户使用起来更加方便,看门狗电路内部结构图如下图所示:

由上图结构图中可以看出,MSP430 MCU内部会提供一个PUC信号,用于清除看门狗计数器,这也就是外部看门狗所描述的喂狗操作,当程序跑死后,这个信号没有产生,因此当看门狗定时器定时时间到时,则会产生一个复位信号,使得系统重新启动。同时看门狗计数器的时钟源可以由用户进行选择。
MSP430看门狗比较简单,可以配置成两种模式:看门狗模式和间隔时间模式。这两种模式的描述及区别如下:
看门狗模式:和硬件看门狗功能一致,在设置好看门狗计数时间后,如果程序跑死情况出现,在设定的时间过后就会触发看门狗中断,同时软件复位,程序指针PC会指向复位向量,程序实现软件复位。注意:看门狗复位顺序是:程序跑死 -> 触发看门狗中断 -> 执行中断服务程序(保存数据等操作,这个由用户决定) -> 复位程序。
间隔时间模式:这个和定时器类似,不过时间不是很精确,在看门狗计数器达到设定时间后,会触发看门狗中断,但不会让软件重启,同时间隔时间模式是不存在喂狗操作的,类似于定时器,每隔设定的时间周期,都会触发看门狗中断,因此可以当作定时器使用。
下面讲解一下看门狗的寄存器,这个比较简单,看门狗仅有一个寄存器,如下图所示:
WDTCLY寄存器:

WDTPW:首先看这个寄存器的高八位,是WDT的密码,在操作这个寄存器时,必须同时输入密码(5Ah),否则写任何数字都会导致看门狗复位程序。(注意,是同事写入不是先写密码,再操作寄存器) 同时这个高八位密码寄存器的读取结果一致都是69h。
WDTHOLD:看门狗定时器的使能,0停止此定时器,1使能此定时器。
WDTSSEL:看门狗定时器时钟源选择,默认是SMCLK,X_CLK时钟尽在部分MSP430 MCU中存在。
WDTTMSEL:模式选择,0选择看门狗模式,1选择间隔时间模式。
WDTCNTCL:看门狗定时器清除位,写1会清除看门狗定时器当前的值,在此定时器达到定时时间后会自动清除。
WDTIS:定时时间设置,在这里有八个定时时间可选,起始这个就是对定时器的设定值进行设定,看门狗计数器是个32位寄存器,最大数为232,但由于看门狗并不要求精确时间,因此设置成8段,提供八个时间足够了,如上图所示计算时间,这个跟时钟源有关系,如图如果时钟源频率是32768Hz,WDTIS = 100b,那么也就是设置的计数值是215=32768,因此定时时间为1秒。
同时,细心的话你会发现,如果正常使用看门狗功能的话,还缺少两个寄存器:中断使能寄存器和中断标志位寄存器。这两个参数WDTIE和WDEIFG分别在SFRIE1.0和SFRIFG1.0寄存器中,如下图所示:
WDTIE(仅有1bit)

WDTIE在SFRIE1寄存器的0bit上,默认是0,即失能看门狗中断,注意:就算失能看门狗终端,如果看门狗定时器设置在看门狗模式下,在程序跑飞后,依旧会复位程序,知识不产生中断了而已,因此如果不适用看门狗定时器,请失能定时器,用下面程序:
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
WDTIFG(仅有1bit)

WDTIFG在SFRIFG1寄存器的0bit上,默认是0,即没有中断产证,可以手动清除,当然,看门狗定时器在进入中断后会自动清除此标志位。
好啦,讲解完原理和寄存器之后,依旧给出看门狗的程序:
Code 1: 间隔时间模式,toggle LED:
//******************************************************************************
#include int main(void) { WDTCTL = WDT_MDLY_32; // WDT 32ms, SMCLK, interval timer P1OUT &= ~BIT0; // Clear P1.0 output latch for a defined power-on state P1DIR |= BIT0; // Set P1.0 to output direction PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode // to activate previously configured port settings SFRIE1 |= WDTIE; // Enable WDT interrupt __bis_SR_register(LPM0_bits | GIE); // Enter LPM0, enable interrupts __no_operation(); // For debug } // Watchdog Timer interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=WDT_VECTOR __interrupt void WDT_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(WDT_VECTOR))) WDT_ISR (void) #else #error Compiler not supported! #endif { P1OUT ^= BIT0; // Toggle P1.0 (LED) } Code 2: 看门狗模式,1秒(使用过程中,看门狗时间需要用户根据自身程序去设定): //****************************************************************************** #include int main(void) { // Selects the ACLK source to REFO (internal 32kHz clock source) as default WDTCTL = WDT_ARST_1000; // Set Watchdog Timer timeout 1s P1DIR |= BIT0; // Set P1.0 to output direction // Disable the GPIO power-on default high-impedance mode // to activate previously configured port settings PM5CTL0 &= ~LOCKLPM5; P1OUT ^= BIT0; // Toggle P1.0 __bis_SR_register(LPM3_bits | GIE); // Enter LPM3 return 0; }
史海拾趣
|
诚聘电子设计师一名。 要求:①.大专以上学历,电子类相关专业; ②.三年以上电子电路设计经验; ③.熟悉单片机开发、汇编语言,熟练使用protel、cad等相关设计软件,精通模拟和数字电路,了解常用电子元器件的性能及特性; ④.能独立开发设计电路 ...… 查看全部问答> |
|
verilog中 比如always @(posedge clk)//CLK频率为125MHZ. 8ns周期 begin ...... end 实际begin end中的语句执行一次 要多少时间啊… 查看全部问答> |
|
最近玩launchpad,写了个简单的小程序通过msp430g2553内部测量温度,然后通过串口通信上传给电脑,但是没有加上校正,只能简单的使用… 查看全部问答> |
|
大家好: 第二期学生的全免费培训已经正式开始,这一期的培训视频也是全部免费的除了周末外视频可能会不定时更新,敬请大家以后多关注。 以下是这一期的培训视频: 免费视频地址为: http://pan.baidu.com/share/link?shareid=484506&uk=1846172 ...… 查看全部问答> |




