IWDG

1.1 IWDG 简介

独立看门狗IWDG,可用于检测软件和硬件异常,如主时钟停振,程序跑飞不再喂狗等。

1.2 功能描述

  • IWDG计数器是递减计数的,计数时钟在驱动里已经配置为内部的 RC 振荡器 LSI。

  • IWDG的重装载寄存器是一个32bit的寄存器,这个值决定IWDG的溢出时间。

  • IWDG可支持配置溢出产生中断或者复位,如果配置为复位,系统会在第一次溢出后会被while住直到第二次看门狗溢出时才产生复位,驱动中默认配置的是溢出后产生复位。

  • IWDG中断可以唤醒LP0和LP2。

  • 芯片上电复位后默认不开启IWDG,需要通过软件配置来使能。

1.3 IWDG 使用场景

  • 独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,那么就会产生系统复位,让程序重新运行。

1.4 IWDG 接口介绍

1.4.1 初始化

HAL_StatusTypeDef HAL_IWDG_Init(uint32_t LoadValue);

参数 LoadValue,配置的是重装载寄存的值,它决定溢出的时间,例如:IWDG的计数时钟为32.768KHz,LoadValue =32768时,表示在没有喂狗的情况下1秒后产生溢出,溢出后再过1秒便会产生复位。

1.4.2 喂狗

HAL_StatusTypeDef HAL_IWDG_Refresh(void);

软件上面需要在看门狗溢出之前执行喂狗动作,否则便会导致看门狗溢出产生复位。LP0和LP2睡眠模式下,应用上面需要算好唤醒起来喂狗的时间,总之,一定要在看门狗计数溢出之前喂狗,或者睡眠之前将看门狗关闭。

1.4.3 反初始化

HAL_StatusTypeDef HAL_IWDG_DeInit(void);

程序需要进入LP3睡眠的时候需要将IWDG功能关掉。

WWDG

2.1 WWDG 简介

窗口看门狗 WWDG,对于过早或过晚喂狗都将产生WWDG复位,可用于检测软件没有喂狗或在禁止喂狗区内喂狗行为,防止程序跑至不可控状态。

2.2 功能描述

  • WWDG计数器是递减计数的,计数时钟在驱动里已经配置为内部的 RC 振荡器 LSI。

  • WWDG的重装载寄存器是一个32bit的寄存器,在窗口看门狗使能后,WWDG计数器载入重装载寄存器值得1/4,开始递减计数,当计数到0时,窗口计数器加1,并在下一个计数时钟到来时,计数器再次载入重装载值的1/4,并继续递减计数。

  • 支持设定喂狗禁止区,通过WIN寄存器来设定

    • 若WIN设置为25%,则窗口计数器为1时,WWDG产生中断标志

    • 若WIN设置为50%,则窗口计数器为2时,WWDG产生中断标志

    • 若WIN设置为75%,则窗口计数器为3时,WWDG产生中断标志

    • WWDG产生中断后,直至窗口计数器到4(累计计数等于重装载值)之前,没有在相应的喂狗窗口期进行喂狗动作,则WWDG模块将产生复位信号。

    • 若WIN寄存器配置为11时,任何区域喂狗都不产生复位。

2.3 WWDG使用场景

  • WWDG 一般被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。 比如一个程序段正常运行的时间是 50ms,在运行完这个段程序之后紧接着进行喂狗, 如果在规定的时间窗口内还没有喂狗,那就说明我们监控的程序出故障了,那么就会产生系统复位,让程序重新运行

2.4 WWDG 接口介绍

2.4.1 初始化

HAL_StatusTypeDef HAL_WWDG_Init(uint32_t LoadValue,enum no_feeding_win win);

通过上面的接口可以配置窗口看门狗的计数值和禁止喂狗区。

2.4.2 获取窗口计数信息

HAL_StatusTypeDef HAL_WWDG_Get_Count(uint8_t *window_cnt,uint32_t *value)

通过上面的接口,可以获取当前WWDG计数信息,包括窗口计数值和当前计数值。

2.4.3 喂狗

HAL_StatusTypeDef HAL_WWDG_Refresh(void);

软件上面需要在合适的时间执行上面的函数去喂狗,如果在禁止喂狗区执行或者在计数溢出之前没有执行都会产生复位。

2.4.4 反初始化

HAL_StatusTypeDef HAL_WWDG_DeInit(void);

在系统进入睡眠前需要将WWDG关闭。