ZHCAFH4A July 2025 – August 2025 MSPM0C1103 , MSPM0C1104 , MSPM0L1306
在主函数中,我们启用 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);
}