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.

[参考译文] MSP430G2553:看门狗程序不工作

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1054135/msp430g2553-watch-dog-program-not-working

器件型号:MSP430G2553

大家好、

问候!!!

我的任务是在微控制器停止时将其复位、因为我使用的是看门狗计时器、

我将看门狗时间周期设置为1sec、并每200ms 清除一次 WDD、因为我正在使用计时器、因此 WDD 不会每1sec 复位一次、

我写了代码、我想检查程序、所以我添加了 while (1);程序在这里暂停、WDT 不会复位微控制器、

我的计划持续 while (1);问题是什么、我做了什么错? 请指导我如何解决该问题。 我在下面提到了我的代码供您参考。

#include "msp430g2553.h"
unsigned int Timer1ms=0;
unsigned int count=0;
void Timer_Init();
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;// Stop the WDT to prevent reset                // Count value for delay
  Timer_Init();
  WDTCTL = WDT_ARST_1000;  // 1 sec watchdog interval

  while(1)
  {
   //   WDTCTL = WDT_ARST_1000;
      count++;
      if(count>5000)
      {
          while(1);
          count=0;
      }
  }
}

void Timer_Init()
{
    DCOCTL = CALDCO_8MHZ;
    BCSCTL1 = CALBC1_8MHZ;
    TA0CCTL0=CCIE;
    TA0CTL=TASSEL_2+MC_1+ID_3;//SMCLK, Up mode, Divider -->1
    TA0CCR0=999;//from above calculation
    _BIS_SR(GIE);//off CPU until interrupt occurs
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    Timer1ms++;
    if(Timer1ms>=200)
    {
        WDTCTL = WDTPW + WDTHOLD + WDTCNTCL;// Stop WDT
        WDTCTL =  WDT_ARST_1000;  //again 1sec reload
        Timer1ms=0;
    }
}

提前感谢!!

此致、

Aravinth K.

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

    您好!

    您无需添加 while (1)即可检查代码。 您可以在计时器 ISR 中添加断点、如第36行或第39行、以检查状态。

    此致、

    现金 Hao

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

    大家好、Cash Hao11、

    感谢您的回复、我刚才在计时器第39行添加了一个断点、它正在工作、但如何手动停止控制器并检查 WDD 是否正在重置控制器?

    谢谢、此致、

    Aravinth K

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

    您好!

    如果您想检查看门狗是否正在复位控制器。 您需要阻止馈送狗代码。

    您可以参考此示例代码以了解一些想法。

    https://dev.ti.com/tirex/explore/node?node=AEBlR0c40D8-.JOaN5u6sQ__IOGqZri__LATEST

    此致、

    现金 Hao

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

    大家好、 Cash Hao11、

    感谢您的回复、  

    上述代码通过一些修改工作、每200ms 我将清除 WDT 计数器、在5000次计数后设置一个标志、以便计时器无法复位 WDT 计数器、从而 WDT 过期并启动复位控制器。 我在下面提到了代码

    感谢您的指导  

    #include "msp430g2553.h"
    unsigned int Timer1ms=0;
    unsigned int count=0;
    unsigned int temp=0;
    void Timer_Init();
    void main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;// Stop the WDT to prevent reset                // Count value for delay
      Timer_Init(); // Initialize timer
      WDTCTL = WDT_ARST_1000;  // 1 sec watchdog interval
      count=0;
      temp=0;//flag
      while(1)
      {
          count++;
          if(count>5000)
          {
              temp=1;// after 5000 count temp will set 
              count=0;//clearing count
          }
    
      }
    }
    
    void Timer_Init()
    {
        DCOCTL = CALDCO_8MHZ;
        BCSCTL1 = CALBC1_8MHZ;
        TA0CCTL0=CCIE;
        TA0CTL=TASSEL_2+MC_1+ID_3;//SMCLK, Up mode, Divider -->1
        TA0CCR0=999;//from above calculation
        _BIS_SR(GIE);//off CPU until interrupt occurs
    }
    
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void TIMER0_A0_ISR(void)
    {
        
       
         if(temp==0)// the WDT count clears every 200ms if temp is 0 else WDT won't clear itself, so WDT resets the controller
        {
            Timer1ms++;
            if(Timer1ms>=200)
            {
                WDTCTL = WDTPW + WDTCNTCL;// Clear WDT counter
                WDTCTL =  WDT_ARST_1000;  //again 1sec
                Timer1ms=0;
            }
        }
    }
    

    谢谢、此致、

    Aravinth K.