ZHCAFH4A July   2025  – August 2025 MSPM0C1103 , MSPM0C1104 , MSPM0L1306

 

  1.   1
  2. 说明
  3. 所需外设
  4. 兼容器件
  5. 设计步骤
  6. 设计注意事项
  7. 软件流程图
  8. 应用代码
  9. 结果
  10. 其他资源
  11. 10E2E
  12. 11商标
  13. 12修订历史记录

应用代码

在主函数中,我们启用 GPIO 中断以检测启动信号。一旦检测到启动信号,便初始化并启动看门狗。此后,每当检测到喂狗信号时,我们就重新加载计时器以防止其溢出。

/*
 * Subsystem example shows basic WDT functionality.
 * It enables two input pins, a WDT_Start and a WDT_WDI, as well
 * as an WDT_WDO output pin to be connected to the reset of the external device.
 *
 *
 * PA27: Input - WDT_Start
 * PA24: Input - WDT_WDI
 * PA0: Output - WDT_WDO (open-drain)
 *
 */

#include "watchdog_hal.h"

int main(void)
{
    SYSCFG_DL_init();
    DL_GPIO_disableInterrupt(GPIOA, WDT_WDI_PIN);

    /* Enable start signal capture */
    DL_GPIO_enableInterrupt(GPIOA, WDT_Start_PIN);
    NVIC_EnableIRQ(WDT_INT_IRQN);

    while (1) {
        __WFI();
    }
}

void watchdog_timer_INST_IRQHandler(void)
{
    switch (DL_TimerG_getPendingInterrupt(watchdog_timer_INST)) {
        case DL_TIMER_IIDX_ZERO:
            /* WDT Timed out */
            watchdog_timeout();
            break;
        default:
            break;
    }
}

void GPIOA_IRQHandler(void)
{
    switch (DL_GPIO_getPendingInterrupt(GPIOA)) {
        case WDT_Start_IIDX:
            /* WDT start pin detected  */
            watchdog_start();
            break;

        case WDT_WDI_IIDX:
            /* WDT feed pin detected  */
            watchdog_reload();
            break;
        
        default:
            break;
    }
}

以下是看门狗的初始化、重新加载及超时的处理方式。

#include "watchdog_hal.h"
#include <stdio.h>


void watchdog_start(void)
{
    /* disable WDT feed pin until WDT started */
    DL_GPIO_disableInterrupt(GPIOA, WDT_Start_PIN);
    DL_GPIO_clearInterruptStatus(GPIOA, WDT_WDI_PIN |WDT_Start_PIN);

    /* Enable WDT Feed pin */
    DL_GPIO_enableInterrupt(GPIOA, WDT_WDI_PIN);
    NVIC_EnableIRQ(watchdog_timer_INST_INT_IRQN);

    DL_Timer_setLoadValue(watchdog_timer_INST, WATCHDOG_PERIOD-1);
    DL_TimerG_startCounter(watchdog_timer_INST);
}

void watchdog_timeout(void)
{
    DL_TimerG_stopCounter(watchdog_timer_INST);
    DL_GPIO_disableInterrupt(GPIOA, WDT_WDI_PIN);

    /* Toggle WDT output fail signal */
    DL_GPIO_clearPins(WDT_PORT, WDT_WDO_PIN); //output low
    delay_cycles(WDO_RESET_TIME);
    DL_GPIO_setPins(WDT_PORT, WDT_WDO_PIN);   //output high

    /* enable WDT start pin */
    DL_GPIO_clearInterruptStatus(GPIOA, WDT_WDI_PIN |WDT_Start_PIN);
    DL_GPIO_enableInterrupt(GPIOA, WDT_Start_PIN);
}

void watchdog_reload(void)
{
    DL_TimerG_stopCounter(watchdog_timer_INST);
    DL_Timer_setLoadValue(watchdog_timer_INST, WATCHDOG_PERIOD-1);
    DL_TimerG_startCounter(watchdog_timer_INST);
}