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**** 2386610 points
Other Parts Discussed in Thread: MSP-EXP430FR2355
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1385520/msp430fr2355-watch-dog-timer-count-reset

器件型号:MSP430FR2355
主题中讨论的其他器件:MSP-EXP430FR2355

工具与软件:

您好!

我想使用看门狗计时器(WDT)、以便在遇到任何软件问题时执行系统重新启动。 我已将 WDT 配置为默认看门狗模式、具有交替时钟源(32k)和1秒超时。 我始终会在1秒之前清除 WDT 计数。 但是、WDT 会在我的应用中持续执行复位。 我已经为 MSP-EXP430FR2355 EVM 编写了用于调试的简化代码。 有人可以检查一下吗? 我是否忘记了有关配置 WDT 的任何信息?

#include <msp430.h>

//  f(DCODIV) = (60+1)*32768 Hz = 2 MHz (1.998.848)
static void init_clock_2MHz(void) {

    __bis_SR_register(SCG0);                                  // disable FLL
    CSCTL3 |= SELREF__REFOCLK;                                // Set REFO as FLL reference source
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_1;// DCO Range = 2 MHz
    CSCTL2 = FLLD_0 + 60;                                     // DCODIV = 2MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0);// enable FLL
    // software_trim();                          // Software Trim to get the best DCOFTRIM value
    CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;// set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz
                                              // default DCODIV as MCLK and SMCLK source
}

/**
 * main.c
 */
int main(void) {

    WDTCTL = WDTPW | WDTHOLD;// stop watchdog timer

    PM5CTL0 &= ~LOCKLPM5;// Disable the GPIO power-on default high-impedance mode
                         // to activate previously configured port settings
    init_clock_2MHz();

    /*! Initialize WDT */
    WDTCTL = WDT_ARST_1000;// Watchdog mode,  ACLK , 1sec timeout

    P1DIR |= BIT0;// Set P1.0 as output

    while (1) {

        /* Clear WDT count */
        WDTCTL |= (WDTPW + WDTCNTCL);

        P1OUT |= BIT0;// high

        __delay_cycles(5E5);// 0.25 sec

        P1OUT &= ~BIT0;// low

        __delay_cycles(5E5);// 0.25 sec
    }

    // return 0;
}

谢谢!

Hassan

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

    >  WDTCTL |=(WDTPW+WDTCNTCL);

    这不起作用、因为 PW 字段读取为0x69、OR-ing 使用0x5A 无法向您提供0x5A。

    可以读取 WDTCTL、清除 PW 域或在(WDTPW+WDTCNTCL)中读回 WDTCTL、但只存储您想要的值(通常是在开始时启动它的值)就没有那么麻烦(结果相同)。 阻抗不匹配

    >  WDTCTL = WDT_ARST_1000;//反馈看门狗

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

    您好、Bruce、好的、谢谢您、它解决了我的问题。