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.

MSPM0L1306-Q1: MSPM0L1306-Q1怎么打开看门狗WATCHDOG

Part Number: MSPM0L1306-Q1
Other Parts Discussed in Thread: SYSCONFIG

 用MSPM0L1306-Q1 (VSSOP 28封装)做了一个板子,现在可以开机和运行LED闪烁程序。

关于看门狗,请问是这样一句函数调用就可以打开了吗?还需要其他的初始化或者使能吗?

DL_WWDT_RESTART(WWDT0);

我故意在板子初始化加了这句,然后故意在后面的程序循环中不再加 DL_WWDT_RESTART(WWDT0); 这句,这样应该可以观察到板子被看门狗重启的现象,但是现在看不到板子重启的情况,似乎是看门狗没有使能,麻烦告诉一下看门狗如何初始化的代码,和平时喂狗的代码,谢谢。

  • Hello Shine,

    1). 我们的SDK中有Watchdog的示例程序,您可以直接参考示例代码: "wwdt_window_mode_periodic_reset" 或者 “wwdt_interval_timer_lfosc_standby”

    2).我发给您的两个文件是参考代码"wwdt_window_mode_periodic_reset" 在CCS上用Sysconig生成的配置文件,从里面您可以直接找到有关看门狗初始化的相关代码,你可以参考,看门狗的使能函数也能找到,是 DL_WWDT_enablePower(WWDT0_INST)。

    8688.ti_msp_dl_config.h
    /*
     * Copyright (c) 2023, 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.
     */
    
    /*
     *  ============ ti_msp_dl_config.c =============
     *  Configured MSPM0 DriverLib module definitions
     *
     *  DO NOT EDIT - This file is generated for the MSPM0L130X
     *  by the SysConfig tool.
     */
    
    #include "ti_msp_dl_config.h"
    
    /*
     *  ======== SYSCFG_DL_init ========
     *  Perform any initialization needed before using any board APIs
     */
    SYSCONFIG_WEAK void SYSCFG_DL_init(void)
    {
        SYSCFG_DL_initPower();
        SYSCFG_DL_GPIO_init();
        /* Module-Specific Initializations*/
        SYSCFG_DL_SYSCTL_init();
        SYSCFG_DL_TIMER_0_init();
        SYSCFG_DL_WWDT0_init();
    }
    
    SYSCONFIG_WEAK void SYSCFG_DL_initPower(void)
    {
        DL_GPIO_reset(GPIOA);
        DL_TimerG_reset(TIMER_0_INST);
        DL_WWDT_reset(WWDT0_INST);
    
        DL_GPIO_enablePower(GPIOA);
        DL_TimerG_enablePower(TIMER_0_INST);
        DL_WWDT_enablePower(WWDT0_INST);
        delay_cycles(POWER_STARTUP_DELAY);
    }
    
    SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
    {
        const uint8_t unusedPinIndexes[] =
        {
            IOMUX_PINCM3, IOMUX_PINCM4, IOMUX_PINCM5, IOMUX_PINCM6,
            IOMUX_PINCM7, IOMUX_PINCM8, IOMUX_PINCM9, IOMUX_PINCM10,
            IOMUX_PINCM11, IOMUX_PINCM12, IOMUX_PINCM13, IOMUX_PINCM14,
            IOMUX_PINCM15, IOMUX_PINCM16, IOMUX_PINCM17, IOMUX_PINCM18,
            IOMUX_PINCM19, IOMUX_PINCM22, IOMUX_PINCM23, IOMUX_PINCM24,
            IOMUX_PINCM25, IOMUX_PINCM26, IOMUX_PINCM27, IOMUX_PINCM28
        };
    
        for(int i = 0; i < sizeof(unusedPinIndexes)/sizeof(unusedPinIndexes[0]); i++)
        {
            DL_GPIO_initDigitalOutput(unusedPinIndexes[i]);
        }
    
        DL_GPIO_clearPins(GPIOA,
            (DL_GPIO_PIN_2 | DL_GPIO_PIN_3 | DL_GPIO_PIN_4 | DL_GPIO_PIN_5 |
            DL_GPIO_PIN_6 | DL_GPIO_PIN_7 | DL_GPIO_PIN_8 | DL_GPIO_PIN_9 |
            DL_GPIO_PIN_10 | DL_GPIO_PIN_11 | DL_GPIO_PIN_12 | DL_GPIO_PIN_13 |
            DL_GPIO_PIN_14 | DL_GPIO_PIN_15 | DL_GPIO_PIN_16 | DL_GPIO_PIN_17 |
            DL_GPIO_PIN_18 | DL_GPIO_PIN_21 | DL_GPIO_PIN_22 | DL_GPIO_PIN_23 |
            DL_GPIO_PIN_24 | DL_GPIO_PIN_25 | DL_GPIO_PIN_26 | DL_GPIO_PIN_27));
        DL_GPIO_enableOutput(GPIOA,
            (DL_GPIO_PIN_2 | DL_GPIO_PIN_3 | DL_GPIO_PIN_4 | DL_GPIO_PIN_5 |
            DL_GPIO_PIN_6 | DL_GPIO_PIN_7 | DL_GPIO_PIN_8 | DL_GPIO_PIN_9 |
            DL_GPIO_PIN_10 | DL_GPIO_PIN_11 | DL_GPIO_PIN_12 | DL_GPIO_PIN_13 |
            DL_GPIO_PIN_14 | DL_GPIO_PIN_15 | DL_GPIO_PIN_16 | DL_GPIO_PIN_17 |
            DL_GPIO_PIN_18 | DL_GPIO_PIN_21 | DL_GPIO_PIN_22 | DL_GPIO_PIN_23 |
            DL_GPIO_PIN_24 | DL_GPIO_PIN_25 | DL_GPIO_PIN_26 | DL_GPIO_PIN_27));
    
        DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_LED_1_IOMUX);
    
        DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_TEST_IOMUX);
    
        DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN |
    		GPIO_LEDS_USER_TEST_PIN);
        DL_GPIO_enableOutput(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN |
    		GPIO_LEDS_USER_TEST_PIN);
    
    }
    
    
    
    SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
    {
    
    	//Low Power Mode is configured to be STANDBY0
        DL_SYSCTL_setPowerPolicySTANDBY0();
        DL_SYSCTL_setBORThreshold(DL_SYSCTL_BOR_THRESHOLD_LEVEL_0);
    
        DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);
    
    }
    
    
    
    /*
     * Timer clock configuration to be sourced by LFCLK /  (32768 Hz)
     * timerClkFreq = (timerClkSrc / (timerClkDivRatio * (timerClkPrescale + 1)))
     *   992.969696969697 Hz = 32768 Hz / (1 * (32 + 1))
     */
    static const DL_TimerG_ClockConfig gTIMER_0ClockConfig = {
        .clockSel    = DL_TIMER_CLOCK_LFCLK,
        .divideRatio = DL_TIMER_CLOCK_DIVIDE_1,
        .prescale    = 32U,
    };
    
    /*
     * Timer load value (where the counter starts from) is calculated as (timerPeriod * timerClockFreq) - 1
     * TIMER_0_INST_LOAD_VALUE = (300 ms * 992.969696969697 Hz) - 1
     */
    static const DL_TimerG_TimerConfig gTIMER_0TimerConfig = {
        .period     = TIMER_0_INST_LOAD_VALUE,
        .timerMode  = DL_TIMER_TIMER_MODE_PERIODIC,
        .startTimer = DL_TIMER_STOP,
    };
    
    SYSCONFIG_WEAK void SYSCFG_DL_TIMER_0_init(void) {
    
        DL_TimerG_setClockConfig(TIMER_0_INST,
            (DL_TimerG_ClockConfig *) &gTIMER_0ClockConfig);
    
        DL_TimerG_initTimerMode(TIMER_0_INST,
            (DL_TimerG_TimerConfig *) &gTIMER_0TimerConfig);
        DL_TimerG_enableInterrupt(TIMER_0_INST , DL_TIMERG_INTERRUPT_ZERO_EVENT);
        DL_TimerG_enableClock(TIMER_0_INST);
    
    
    
    
    }
    
    
    SYSCONFIG_WEAK void SYSCFG_DL_WWDT0_init(void)
    {
        /*
         * Initialize WWDT0 in Watchdog mode with following settings
         *   Watchdog Source Clock = (LFCLK Freq) / (WWDT Clock Divider)
         *                         = 32768Hz / 4 = 8.19 kHz
         *   Watchdog Period       = (WWDT Clock Divider) ∗ (WWDT Period Count) / 32768Hz
         *                         = 4 * 2^12 / 32768Hz = 500.00 ms
         *   Window0 Closed Period = (WWDT Period) * (Window0 Closed Percent)
         *                         = 500.00 ms * 25% = 125.00 ms
         *   Window1 Closed Period = (WWDT Period) * (Window1 Closed Percent)
         *                         = 500.00 ms * 0% = 0.00 s
         */
        DL_WWDT_initWatchdogMode(WWDT0_INST, DL_WWDT_CLOCK_DIVIDE_4,
            DL_WWDT_TIMER_PERIOD_12_BITS, DL_WWDT_RUN_IN_SLEEP,
            DL_WWDT_WINDOW_PERIOD_25, DL_WWDT_WINDOW_PERIOD_0);
    
        /* Set Window0 as active window */
        DL_WWDT_setActiveWindow(WWDT0_INST, DL_WWDT_WINDOW0);
    
    }
    
    
    
    Best Regards,
    Janz Bai
  • 谢谢,已经可以打开看门狗了。但是又发现了一个问题,用  DL_WWDT_RESTART(WWDT0);  这句似乎喂狗不成功,请问喂狗是只要这句吗?谢谢。

  • 调试发现一旦用了 DL_WWDT_RESTART(WWDT0);  马上就死机,请问这个是什么原因?急,谢谢。

  • Hello Shine,

    1). Watchdog需要定时喂狗,不然它会触发reset。Watchdog是有open window时间段的,你需要在这段时间内通过Timer 定时器的方式去restart Watchdag, 也就是所谓的喂狗。关于Watchdog的open window以及相关的信息请查看我们的user guide。

    2). 喂狗是使用DL_WWDT_RESTART();语句;

    3).死机是怎么一个死机法,是无法连接SWD了,还是直接CCS卡死了还是出现了什么状况;

    Best Regards,

    Janz Bai

  • 找到问题了,是在CLOSE WINDOW喂狗的问题,但是我在看门狗初始化的函数把 close window设置为  dl_wwdt_winow_period_0,  结果MCU仍然运行不起来,所以现在的问题是,请问怎么才能把  close window关掉? 代码怎么写?  谢谢。

  • 非常谢谢你,那如果我想关掉close window呢? 我试过设置 dl_wwdt_initwatchdogmode里面设置close window为  dl_wwdt_winow_period_0,  结果MCU会不运行,请问如何关闭close window? 谢谢。

  • 关于close window 和open window的问题,在user guide上都有相关详细描述,请参考user guide。以及您无法下载sysconfig,但是我们有在线版本的sysconfig可以帮助您去查看外设的配置方法。user guide和sysconfig可以在我们的官网上找到

    MSPM0 L-Series 32-MHz Microcontrollers Technical Reference Manual (Rev. C) (ti.com)

    TI Developer Zone

  • 谢谢你,我先看一下。

  • 你好,请看红线这一句,我就是仅仅把dl_wwdt_initwatchdogmode里面设置close window为  dl_wwdt_winow_period_0, 如下, 结果MCU不运行,请问可能是有什么地方还要设置一下?谢谢。

    DL_WWDT_initWatchdogMode(WWDT0_INST, DL_WWDT_CLOCK_DIVIDE_4, DL_WWDT_TIMER_PERIOD_12_BITS, DL_WWDT_RUN_IN_SLEEP,
    DL_WWDT_WINDOW_PERIOD_0, DL_WWDT_WINDOW_PERIOD_0);

  • 这句配置函数看上去是没有问题的,但是1). 关于看门狗的整体初始化配置是否正确,需要检查,怎么检查怎么使用在线版Sysconfig查看配置的初始化代码,我在您另一篇关于ADC的初始化代码的贴子里回复了; 2). 要注意下你是否在定时喂狗,就是是否在Window期间内进行了喂狗,虽然没有closed window了但是仍需要在active window区间内喂狗,不然MCU就会被reset;3). 具体功能和MCU运行不了是到底如何运行不了 (一直被reset,程序卡死,或者......), 需要针对不同的症状再考虑解决办法。 4). Watchdog的初始化函数我在这里给您贴一下, 关于各种外设的初始化代码请使用Sysconifgs生成查看。

    DL_WWDT_reset(WWDT0_INST);
    DL_WWDT_enablePower(WWDT0_INST);
    SYSCONFIG_WEAK void SYSCFG_DL_WWDT0_init(void)
    {
        /*
         * Initialize WWDT0 in Watchdog mode with following settings
         *   Watchdog Source Clock = (LFCLK Freq) / (WWDT Clock Divider)
         *                         = 32768Hz / 4 = 8.19 kHz
         *   Watchdog Period       = (WWDT Clock Divider) ∗ (WWDT Period Count) / 32768Hz
         *                         = 4 * 2^12 / 32768Hz = 500.00 ms
         *   Window0 Closed Period = (WWDT Period) * (Window0 Closed Percent)
         *                         = 500.00 ms * 0% = 0.00 s
         *   Window1 Closed Period = (WWDT Period) * (Window1 Closed Percent)
         *                         = 500.00 ms * 0% = 0.00 s
         */
        DL_WWDT_initWatchdogMode(WWDT0_INST, DL_WWDT_CLOCK_DIVIDE_4,
            DL_WWDT_TIMER_PERIOD_12_BITS, DL_WWDT_RUN_IN_SLEEP,
            DL_WWDT_WINDOW_PERIOD_0, DL_WWDT_WINDOW_PERIOD_0);

        /* Set Window0 as active window */
        DL_WWDT_setActiveWindow(WWDT0_INST, DL_WWDT_WINDOW0);

    }
  • 我的代码也是这样的,,有些奇怪了,我再看看是否有其他问题,谢谢你!

  • Ok you are welcome!