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.

MSP430F2370: 看门狗不会复位

Part Number: MSP430F2370

我使用这个MSP430F2370芯片目前在大规模使用中发现有些客户反馈程序无法正常使用,必须要断电重新启动才正常。程序在上电后会关看门狗2秒左右但是如果是检测到看门狗复位直接跳过,之后就初始化看门狗一直打开。现在感觉是干扰问题导致芯片无法启动看门狗复位,大家有没有遇到这种情况,有没有什么好的建议

  • 程序在上电后会关看门狗2秒左右但是如果是检测到看门狗复位直接跳过

    能否给出您的程序?另外请您在板子上测试一下下面的程序

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430x24x Demo - Reset on Invalid Address fetch, Toggle P1.0
    //
    //  Description: This program demonstrates how a reset is executed if the CPU 
    //  tries to fetch instructions from within the module register memory address 
    //  range (0x0000 --0x01FF) or from within unused address ranges. Toggle P1.0 
    //  by xor'ing P1.0 inside of a software loop that ends with TAR loaded with 
    //  3FFFh - op-code for "jmp $". This simulates a code error. The MSP430F229 
    //  will force a reset because it will not allow a fetch from within the address 
    //  range of the peripheral memory, as is seen by return to the mainloop and 
    //  LED flash.
    //  ACLK = n/a, MCLK = SMCLK = default DCO ~1.045Mhz
    //
    //                MSP430F249
    //             -----------------
    //         /|\|              XIN|-
    //          | |                 |
    //          --|RST          XOUT|-
    //            |                 |
    //            |             P1.0|-->LED
    //
    //  B. Nisarga
    //  Texas Instruments Inc.
    //  September 2007
    //  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A
    //******************************************************************************
    #include <msp430.h>
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
      P1DIR |= 0x01;                            // Set P1.0 to output direction
      TAR = 0x3FFF;                             // Valid opcode (for "jmp $")
    
      for (;;)
      {
        volatile unsigned int i;
    
        P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR
    
        i = 50000;                              // Delay
        do (i--);
        while (i != 0);
        // C code to directly call an address location
        ((void (*)())0x170)();                  // Invalid fetch ("call #0170h")
        /* 0x170 is address of TAR register and is within the module register memory 
        address range (0x0000 --0x01FF) */                                       
      }                                         // ** Should never get here **
    }
    

  • 我测试上面代码是不断重启MCU的,下面是我部分的代码

    void main1(void)
    {
        //$$$ .初始化 - 关看门狗,设置时钟
        //..........................................................................
        WDTCTL = WDTPW + WDTHOLD;                         // Stop WDT
        OSCsel(SYS_CLK_8M);                               //set the oscilator
        FCTL2 = FWKEY + FSSEL_2 + FN4 + FN3 + FN2 + FN1;  // MCLK/2 for Flash Timing Generator
    
    
        //$$$ .IO 初始化,设置TRF796x端口初始化
        //.........................................................................
        IO_INIT();          //IO初始化
        PARset();           //TRF796x并行模式,端口设置
    
    
        //$$$ .Modbu协议初始化
        //.........................................................................
        FLASH_INIT();      	//FLASH,相关项目初始化
        ModbusInit(DEV_infor.DevID, SendMultByte, UartBufMax);  //modbus初始化
        HostCommands();     //主机控制
    }
    
    void IO_INIT(void)
    {
        //$$$ .LED_ID, RS485 初始设置
        //..........................................................................
        P3DIR |= BIT6;		// LED -- P3.6 - output
        // P3REN |= BIT6;  	//LED--使能上拉电阻
        //
        P2DIR |= BIT3;		// RS485EN --P2.3 - output
        // P2REN |= BIT3;  	//RS485EN 使能上拉电阻
        SetRS485_Rx; 		//使能RS485接收
    
        //$$$ .LED_ID 开机闪烁控制
        //..........................................................................
        if((IFG1 & 0x01) == 0x00) //看门狗超时引起的重启不延时 2017年5月25日----    
        { 
        LED_ID_OFF;        	//LED灭
        delay_ms(600);     //上电LED先灭
        LED_ID_ON;        	//LED亮
        delay_ms(100);   	//定时不准 后面再调整
        LED_ID_OFF;        	//LED灭
        
        delay_ms(900);     //上电LED先灭
        LED_ID_ON;        	//LED亮
        delay_ms(100);   	//定时不准 后面再调整
        LED_ID_OFF;        	//LED灭
    
        }
    }
    
    void OSCsel(unsigned char mode)
    {
    
        unsigned int ii1;
    
        if (mode == 0x00)                             //select crystal oscilator
        {
            BCSCTL1 |= XTS + XT2OFF;                  // ACLK = LFXT1 HF XTAL
            BCSCTL3 |= LFXT1S1;                       // 3 ?16MHz crystal or resonator
            // turn external oscillator on
            do
            {
                IFG1 &= ~OFIFG;                       // Clear OSCFault flag
                for (ii1 = 0xFF; ii1 > 0; ii1--);     // Time delay for flag to set
            }
            while ((IFG1 & OFIFG) == OFIFG);          // OSCFault flag still set?
            BCSCTL2 |= SELM1 + SELM0 + SELS;           //  MCLK = SMCLK = HF LFXT1 (safe)
    
            //return;
        }
    
        else                           				//select DCO for main clock
        {
            if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF)
            {
                while (1);                 			// If calibration constants erased
                // do not load, trap CPU!!
            }
    
            //BCSCTL1:
            BCSCTL1 = CALBC1_8MHZ;      			// Set DCO to 8MHz
            DCOCTL = CALDCO_8MHZ;
            BCSCTL1 &= ~XTS;                		//使能低频内部时钟12KHZ
    
            //BCSCTL2: MCLK,SMCLK
            BCSCTL2 = 0;
    
            //BCSCTL3:
            BCSCTL3 |= LFXT1S1;       				//LFXT1 范围选择 = VLOCLK
    
        }
        P1DIR |= 0x10;                            	// P1.4 output direction
        P1SEL |= 0x10;                            	// P1.4 = SMCLK
    
    }
    
    void HostCommands()
    {
        POLLING = 0;  
        GucUIDLen = 0;
        GucComRecCount = 0;
        PcdAntennaOn();      		//打开天线
        ClrWDG();                 	        //启动看门狗,超时0.6S重启
        EnableInterrupts;   		//使能全局中断
    
        while (1)
        {
            ClrWDG();
    		//主循环
    	}
    }

  • 谢谢反馈。看起来您的代码没什么问题。

    您是否有在线调试到哪句代码复位?

    另外建议将MSP430的看门狗相关代码单独拿出来测试

  • 这个问题不是某行代码出现的,在客户现在使用一段时间后出现的。不知道你们有没有收到类似问题,就是我开了看门狗受到什么干扰单片机导致看门狗不能复位