当先锋百科网

首页 1 2 3 4 5 6 7

看门狗工作原理

在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗(喂狗),那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。

看门狗作用

看门狗的作用就是防止程序发生死循环或者卡死,或者说程序跑飞。

看门狗框图

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

调试运行,系统不再复位,符合预期:
在这里插入图片描述