This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:看门狗是否立即关闭?

Guru**** 1138100 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1337792/msp430fr2355-watchdog-goes-off-immediately

器件型号:MSP430FR2355

你好……

我在 main 中有以下代码:(根据我希望看门狗从 ACLK 运行16秒的设置...这是一个已经使用了一年多的设计、我只是在其中添加了看门狗、因此硬件很好)

int main(void)
{
    SYSCFG2 |= RTCCKSEL;
    WDTCTL = WDTPW | WDTCNTCL | WDTSSEL__ACLK | WDTIS1 | WDTIS0 | WDTHOLD;   //watchdog 16 second using ACLK, hold state, reset cntr

然后、我有一个按钮式 ISR、在其中放置一个断点:

    //activate watchdog
    tempWDCTL = ((WDTCTL | WDTCNTCL) & 0x00FF);
    tempWDCTL &= ~WDTHOLD;
    WDTCTL = WDTPW | tempWDCTL;
    P1IE &= ~0xFE;

P1IE 上的断点显示 WDTCTL = 0x6923、这在我看来是正确的。  有人能告诉我我做的不正确的事情吗?

谢谢

史蒂夫  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    通常的方法是把狗留在 main ()的开头(或更早的,如果需要的话),然后根据需要设置它。 然后定期复位计数器。 不显示定期复位。

    如果你确实是在 ISR 中清除 WDTHOLD、那是错误的。

    通常链接到一篇关于看门狗的文章: www.ganssle.com/watchdogs.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴了解 ISR、并感谢发表文章...代码就是所有 ISR、其中的按钮可驱动所有活动、创建数据、然后通过无线电发送。  不确定这是什么好处,说 一个计时器唤醒并定期启动看门狗,因为这 可能会继续工作,即使在说对讲机关闭或锁定时...

    我的方法是在一个按钮事件上启动"狗"(我重置并在 ISR 中退出暂停)-- 我在这里创建了一个软标志、我在 main 中清除、并且可以将代码移到这里)、然后在无线电返回后踢它...如果无线电不返回、它会重新启动固件。  我会采纳建议并将事情移出 ISR、但现在……

    仍然没有向我解释,虽然为什么 一步过 P1IE 让我回到了主,没有16秒周期?????

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴了解 ISR、并感谢发表文章...代码就是所有 ISR、其中的按钮可驱动所有活动、创建数据、然后通过无线电发送。  不确定这是什么好处,说 一个计时器唤醒并定期启动看门狗,因为这 可能会继续工作,即使在说对讲机关闭或锁定时...

    我的方法是在一个按钮事件上启动"狗"(我重置并在 ISR 中退出暂停)-- 我在这里创建了一个软标志、我在 main 中清除、并且可以将代码移到这里)、然后在无线电返回后踢它...如果无线电不返回、它会重新启动固件。  我会采纳建议并将事情移出 ISR、但现在……

    仍然没有向我解释,虽然为什么 一步过 P1IE 让我回到了主,没有16秒周期?????

    不能完全解释它,但是... 从主程序中的设置中删除 WDTCNTCL 似乎解决了这个问题,因为它现在等待16秒...奇怪(至少对我来说),但工作正常。

    要为未来用户添加:

    重要提示: 切勿 尝试使用 WDCTL |=来设置位!!!!  始终使用 WDCTL =!!!!

    首先进行读取、然后进行或、然后进行重写...读取会在高字节中产生0X69、当重写入寄存器时、由于没有在高字节中写入0X5A、会自动复位电路板。