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.

看门狗喂狗操作

Other Parts Discussed in Thread: MSP430F5310, MSP430G2553

请问msp430F5310的看门狗喂狗操作的同时需要设置看门狗的触发时间吗?我这样喂狗 WDTCTL = WDTPW + WDTCNTCL  后看门狗不能生效啊,但这样喂WDTCTL = WDTPW + WDTCNTCL+WDTSSEL0+WDTIS2后看门狗就能在1s重启单片机。希望高手指教一下,谢谢。

  • wang junzheng, 你好!默认情况下,WDT的watchdog mode初始是约为32ms的 reset interval。

    按照user guide上的software examples, 喂狗应该为如下所示的程序,

    ; Periodically clear an active watchdog

    MOV #WDTPW+WDTIS2+WDTIS1+WDTCNTCL,&WDTCTL

  • 那如果我这样喂狗

    MOV #WDTPW+WDTCNTCL,&WDTCTL

    那就应该是32ms就重启系统啊,但这样喂狗后系统就不会重启了(喂狗后我加了很长的延时3s以上,但并没有重启),这是怎么回事啊?还有就是喂狗的同时必须要重新设置看门狗时间吗?

  • 如果我这样喂狗

    MOV #WDTPW+WDTCNTCL,&WDTCTL

    那就应该是32ms就重启系统啊,但这样喂狗后系统就不会重启了(喂狗后我加了很长的延时3s以上,但并没有重启),这是怎么回事啊?还有就是喂狗的同时必须要重新设置看门狗时间吗?

  • wang junzheng,你试着把你程序中的喂狗WDTCTL = WDTPW + WDTCNTCL  ,改为WDTCTL |= WDTPW + WDTCNTCL,再试试看,应该就可以32ms重启系统了。因为默认WDTIS=4 【1(1M/32k)=32ms 】,但是按照WDTCTL = WDTPW + WDTCNTCL  喂狗后,则为WDTIS=0 【1(1M/2G)=2000s 】,故在你即使延时了3s,也没有复位。你先试试看看是不是这样。

  • 改为WDTCTL |= WDTPW + WDTCNTCL后单片机根本起不来,我把看门狗时间设为16ms开机都能运行,但好像WDTCTL |= WDTPW + WDTCNTCL这个不是设置我32ms了,开机立马就重启了。

  • 我在while(1)中这样喂狗WDTCTL |= WDTPW + WDTCNTCL,但开机就重启了,一直不能上电运行;我把看门狗时间设置为WDT_ARST_16模式,16ms都能开机运行。

    好像WDTCTL 不能这样操作,我WDTCTL |= WDTPW + WDTCNTCL+WDTSSEL0+WDTIS2这样设置1s也是立刻重启了,好像一喂狗就产生了puc,我推断WDTCTL 控制寄存器不能或操作,只能赋值

  • 您好。

    这个操作可以用宏来操作,并同时会设置时间,具体可参考MSP430F5310.h的内容,例如:

    #define WDTSSEL__ACLK          (1*0x0020u)    /* WDT - Timer Clock Source Select: ACLK */

    /* WDT is clocked by fACLK (assumed 32KHz) */

    #define WDT_ARST_1000       (WDTPW+WDTCNTCL+WDTSSEL0+WDTIS2)                         /* 1000ms  " */

  • wang junzheng,我试了试,你说的是对的,的确不能用WDTCTL |= WDTPW + WDTCNTCL,但是我用WDTCTL = WDTPW + WDTCNTCL进行喂狗操作,是可以成功的,不过我用的是MSP430G2553。测试程序如下:

    #include  <msp430g2553.h>

    void main(void)

    {

    //  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

     WDTCTL = WDTPW + WDTCNTCL;

     P1DIR |= 0x01;                            // Set P1.0 to output direction

     for (;;)

     {

       volatile unsigned int i;

       P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR

       i = 32000;                              // Delay

       do (i--);

       while (i != 0);

       WDTCTL = WDTPW + WDTCNTCL;

     }

    }

  • 我用的是MSP430F5310,你这样是可以的,我是自己试出来在喂狗那要重新设置看门狗时间间隔的,但我在手册中没看到有说在喂狗时要重新设置看门狗时间间隔啊,我是初次弄单片机,对这个不是很懂,想弄明白。

  • 谢谢Lina Lian 耐心的给予帮助,谢谢。

  • wang junzheng, 抱歉,我前面那个测试,我测试不完全。我认为就像我前面说的,如果我们使用 WDTCTL = WDTPW + WDTCNTCL;的话对应WDTIS=0 【1(1M/2G)=2000s 】,这个需要约为半小时才会导致系统复位,我正在做这个测试。半小时后,才可给出最终结论。而喂狗时,就像你说的,不能通过或运算来对WDT寄存器进行操作,因为Watchdog timer password,故需要直接写入寄存器,故若要保证固定的时间间隔,则每次喂狗时,均需要写入看门狗的时间间隔,其实 WDTCTL = WDTPW + WDTCNTCL; 也就相当于写了时间间隔为2000s,当然,这些结论,在我们验证了2000s后复位,就更确定了。

  • 太感谢您了,向您这么严谨的态度致敬!我态度就不严谨,所以有时懂得不全。

    我看了你在晶振停振问题的回答,还有一个问题需要请教一下:

    如果晶振中途停振了,单片机会出现死机的情况,复位也不行吗?如果晶振过一会又启振了,单片机还会继续正常工作吗?我遇到了单片机死机的情况,复位也不行,只有断电重新上电单片机才能正常工作。

  • 太感谢您了,向您这么严谨的态度致敬!我态度就不严谨,所以有时懂得不全。

    我看了你在晶振停振问题的回答,还有一个问题需要请教一下:

    如果晶振中途停振了,单片机会出现死机的情况,复位也不行吗?如果晶振过一会又启振了,单片机还会继续正常工作吗?我遇到了单片机死机的情况,复位也不行,只有断电重新上电单片机才能正常工作。

  • 太感谢您了,向您这么严谨的态度致敬!我态度就不严谨,所以有时懂得不全。

    我看了你在晶振停振问题的回答,还有一个问题需要请教一下:

    如果晶振中途停振了,单片机会出现死机的情况,复位也不行吗?如果晶振过一会又启振了,单片机还会继续正常工作吗?我遇到了单片机死机的情况,复位也不行,只有断电重新上电单片机才能正常工作。

  • 验证成功,约半小时后,系统成功复位。前面的结论全部成立。故如果想要用WDTCTL = WDTPW + WDTCNTCL;直接喂狗,又想让时间较短,你还可以将SMCLK的频率设高,这样系统复位时间就会对应变短,也可减少你验证的时间。

  • wang junzheng, O(∩_∩)O~,这也是我自己学习和验证的过程。关于你说的晶振停振问题,请问你的外部晶振使用的是哪个?XT1的LFmode, HF mode还是XT2。对于MSP430F5310而言,不论是哪种,它都有很完善的晶振失效保护机制,具体请参考 5.2.12 UCS Module Fail-Safe Operation。外部晶振失效时,UCS会使得系统时钟MCLK,SMCLK,ACLK 的时钟源转为内部clock源,例如REFO或者DCO,应该是不会有单片机死机情况的出现的。你可以将外部晶振作为某个系统时钟源,从特定pin引出来,用示波器进行观察。

  • 用的是XT1的LFmode,好的,谢谢

  • 请教一下,看门狗喂狗的时候需不需要先执行这个操作 WDTCTL = WDTPW + WDTHOLD; 然后再喂狗呢?   看有关资料上说对WDT相关寄存器操作前最好先执行此操作!!!

  • zhijie su,

    看门狗喂狗时不需要执行WDTCTL = WDTPW + WDTHOLD;, 此代码的功能是停用停用看门狗  // Stop WDT

    如果喂狗可以参照之前的讨论。