判断看门狗是否开启的方法
1. 检查看门狗控制寄存器
HC32L19X 看门狗控制寄存器检查
#include "hc32l19x.h"bool IsWatchdogEnabled(void)
{// 检查WWDT控制寄存器使能位if (M0P_WDT->CR & 0x01) // 检查使能位{return true; // 看门狗已开启}return false; // 看门狗未开启
}
2. 软件检测方法
3. 方法一:超时复位检测
void CheckWatchdogStatus(void)
{static uint32_t lastTick = 0;static uint32_t resetCount = 0;// 检查是否发生了看门狗复位if (M0P_RST_ST0 & 0x02) // 检查看门狗复位标志{printf("看门狗复位发生!\n");M0P_RST_ST0 |= 0x02; // 清除复位标志}// 定期打印信息,观察是否正常执行if (HAL_GetTick() - lastTick > 5000){lastTick = HAL_GetTick();printf("系统正常运行,看门狗可能未开启或正常喂狗\n");}
}
方法二:喂狗测试
void TestWatchdogByFeeding(void)
{printf("开始看门狗测试...\n");// 故意延迟,观察是否复位for(int i = 0; i < 10; i++){HAL_Delay(1000);printf("运行 %d 秒\n", i+1);// 如果不喂狗,看门狗开启时会复位// WWDT_FeedDog(); // 注释掉喂狗操作}printf("如果看到此信息,看门狗可能未开启\n");
}
3. 硬件调试方法
使用调试器检查
void DebugWatchdogStatus(void)
{// 在调试模式下检查寄存器值uint32_t wdt_cr = M0P_WDT->CR;uint32_t wdt_sr = M0P_WDT->SR;printf("WDT控制寄存器: 0x%08lX\n", wdt_cr);printf("WDT状态寄存器: 0x%08lX\n", wdt_sr);if (wdt_cr & 0x01){printf("看门狗已开启\n");printf("超时时间: %lu ms\n", CalculateTimeout(wdt_cr));}else{printf("看门狗未开启\n");}
}uint32_t CalculateTimeout(uint32_t wdt_cr)
{// 根据预分频器和重载值计算超时时间uint32_t prediv = (wdt_cr >> 8) & 0x07; // 预分频器uint32_t reload = (wdt_cr >> 16) & 0xFFF; // 重载值uint32_t timeout_ms = (reload * (1 << (prediv + 1))) / 1000;return timeout_ms;
}
4. 完整的检测程序
#include "hc32l19x.h"
#include <stdio.h>typedef enum
{WDT_DISABLED = 0,WDT_ENABLED = 1,WDT_STATUS_UNKNOWN = 2
} WDT_Status_t;WDT_Status_t CheckWatchdogCompleteStatus(void)
{WDT_Status_t status = WDT_STATUS_UNKNOWN;// 方法1:检查控制寄存器if (M0P_WDT->CR & 0x01){status = WDT_ENABLED;printf("寄存器检测: 看门狗已开启\n");}else{status = WDT_DISABLED;printf("寄存器检测: 看门狗未开启\n");}// 方法2:检查复位状态寄存器if (M0P_RST_ST0 & 0x02){printf("最近发生过看门狗复位\n");M0P_RST_ST0 |= 0x02; // 清除标志}return status;
}void WatchdogBehaviorTest(void)
{printf("=== 看门狗行为测试 ===\n");WDT_Status_t status = CheckWatchdogCompleteStatus();if (status == WDT_DISABLED){printf("测试: 看门狗确认未开启,系统不会因未喂狗复位\n");// 长时间运行测试for(int i = 0; i < 30; i++){HAL_Delay(1000);printf("运行 %d 秒 - 看门狗未开启,系统正常\n", i+1);}}else if (status == WDT_ENABLED){printf("警告: 看门狗已开启!需要定期喂狗\n");printf("开始喂狗测试...\n");for(int i = 0; i < 10; i++){HAL_Delay(1000);WWDT_FeedDog(); // 正常喂狗printf("正常运行 %d 秒,已喂狗\n", i+1);}}
}int main(void)
{// 系统初始化SystemInit();// 检查看门狗状态WatchdogBehaviorTest();while(1){// 主循环HAL_Delay(1000);// 如果看门狗开启,需要在这里定期喂狗// WWDT_FeedDog();}
}
5. 判断依据总结
判断方法 | 看门狗开启的特征 | 看门狗关闭的特征 |
---|---|---|
寄存器检查 | CR寄存器的使能位为1 | CR寄存器的使能位为0 |
复位标志 | RST_ST0有看门狗复位标志 | 无看门狗复位标志 |
行为测试 | 不喂狗会导致系统复位 | 不喂狗系统正常运行 |
调试观察 | 计数器值在变化 | 计数器值不变 |