SSDA008A July   2025  – August 2025 MSPM0C1103 , MSPM0C1104 , MSPM0L1306

 

  1.   1
  2. Description
  3. Required Peripherals
  4. Compatible Devices
  5. Design Steps
  6. Design Considerations
  7. Software Flowchart
  8. Application Code
  9. Results
  10. Additional Resources
  11. 10E2E
  12. 11Trademarks
  13. 12Revision History

Application Code

In the main function, we enable the GPIO interrupt to detect the start signal. Once the start signal is detected, we initialize the watchdog and start. After that, every time a feed signal is detected, we reload the timer to prevent overflow.

/*
 * 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;
    }
}

The following is the handling of watchdog initialization, reload, and timeout.

#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);
}