为什么程序会停止MSP430上的看门狗定时器?


11

MSP430的许多示例程序的第一行是:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

他们为什么这样做呢?

Answers:


15

看门狗定时器(WDT)默认情况下处于打开状态,这在更复杂的应用程序中很有用,但会使很多新手失望。他们通常不会在代码中服务WDT,也不会包含中断服务程序(ISR)来处理WDT事件,因此,当芯片不断复位时,他们会感到非常沮丧。此外,示例程序在大多数情况下都不是为了演示WDT,因此已将其关闭。

编辑:看门狗定时器可以被命名为“死人的开关”。它的默认行为是重置微控制器,除非固件定期让其知道一切运行正常。这就是所谓的“喂狗”或“踢狗”。这样,如果您的固件陷入了循环或以其他方式停止按预期运行,则看门狗将无法供电,并将芯片复位(希望恢复到全新的工作状态)。

您也可以将WDT用作定期中断来执行其他任务,无论您能想到什么。您只需要编写相关的ISR。


+1谢谢,尽管我和其他读者可以查找它,但很高兴能很简短地了解WDT重置芯片的原理。(不过,不必担心添加它,您的答案足够好接受它(在等待了几个小时的其他可能答案之后))
necromancer

我想我应该在问题中提到我是绝对的新手,也不知道看门狗计时器是什么:)
necromancer

2
@necromancer啊,不用担心,我已经添加了相关信息。
塞缪尔

2
Samuel-在几乎所有情况下,您都不应使用ISR复位WDT。这几乎总是错误的事情。当程序的其他部分在la-la land中断时,中断可能会很愉快地继续。偶尔可能/必要(ISR与固件的其他部分之间的通信有效地设置了WDT的第二级别),但不建议新手作为第一种方法。
Spehro Pefhany 2014年

9

除了Samuel关于人们不小心绊倒WDT的观点外,还有另一个重要原因也是为什么最初应该禁用它。

即使您的应用程序通常能够正确重置计时器,也可能在初始化代码期间无法重置计时器,原因有两个:

  • 初始化可能需要比单个WDT滴答更长的时间,但是需要禁用中断。这意味着,例如,如果您依靠计时器ISR重置计时器,则可能会陷入无限启动循环。
  • 您不一定知道所有MCU上的计时器寄存器的状态(即,下一个滴答可能比预期的要早得多,因为寄存器可能不会从0开始)。

因此,即使您从未启用 WDT,也要禁用它,这是一个好习惯。

如果您确实想使用它,则可以在启动中断之前立即重新启用它,这是初始化代码的最后一步。


+1感谢您添加到答案中。我发现您可以在使用int _system_pre_init(void)函数执行初始化之前将其禁用main
necromancer 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.