看门狗工作原理
在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗(喂狗),那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。
看门狗作用
看门狗的作用就是防止程序发生死循环或者卡死,或者说程序跑飞。
看门狗框图
S32K1xx Series Reference Manual
第23章给出了看门狗的框图:
看门狗配置
Components Library 中添加 wdog
组件,配置wdog:
- 时钟源默认
WDOG_LPO_CLOCK
(默认128kHz,可到clock_manager
中修改为32kHz或者1kHz) - 勾选 预分频使能(鼠标悬停提示固定256分频,这样分频后的
clock cycles
就变成了500Hz,128000 / 256 = 500 Hz) - 设置 Timeout Value 为1000,也就是2s( T = (1/500)*1000 = 2s )内喂狗就不会复位了,注意Window Value 和 Timeout Value 都是16位计数器,值必须在[1,65535],否则无效(回到之前的值)
串口配置
-
Components Library 中添加
lpuart
组件,配置lpuart,选择LPUART2,波特率为115200:
-
双击工程名,点击Components目录下的
pin_mux:PinSettings
,LPUART中选择PTA8/PTA9,并设置发送为Output:
代码补全
- 系统和引脚的初始化:
/* Write your code here */
/* For example: for(;;) { } */
CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
- 串口的初始化:
- 看门狗初始化和喂狗:
/* Initialize WDOG */
WDOG_DRV_Init(INST_WATCHDOG1, &watchdog1_Config0);
LPUART_DRV_SendData(INST_LPUART2, "WDOG ENABLE!!\r\n", 15);
for(;;)
{
LPUART_DRV_SendData(INST_LPUART2, "汪汪汪", 6);
OSIF_TimeDelay(3000);//3秒延时
/* Reset Watchdog counter */
WDOG_DRV_Trigger(INST_WATCHDOG1);
}
3s喂狗,没喂上,系统复位:
可以看到,约2s系统就会复位一次,现在把延时改成约1s,这样狗就能喂上了:
/* Initialize WDOG */
WDOG_DRV_Init(INST_WATCHDOG1, &watchdog1_Config0);
LPUART_DRV_SendData(INST_LPUART2, "WDOG ENABLE!!\r\n", 15);
for(;;)
{
LPUART_DRV_SendData(INST_LPUART2, "汪汪汪", 6);
OSIF_TimeDelay(1000);//1秒延时
/* Reset Watchdog counter */
WDOG_DRV_Trigger(INST_WATCHDOG1);
}
调试运行,系统不再复位,符合预期: