为什么需要看门狗
我们总是期望产品能够一直稳定运行从不宕机,但事实总是不尽人意,有各种预料不到的情况发生,宕机不可避免,退而求次,我们又希望万一发生宕机,系统能够自行检测并恢复。看门狗就是为了检测故障并恢复一种常见手段。
为什么叫看门狗呢?其实是一个很形象的称呼,就好像有只狗在看门一样,CPU需要固定时间喂一次食,不管CPU出于任何原因没有喂狗,狗就会叫,我们知道CPU肯定是出问题了。
看门狗通常有两类,
- 外部看门狗,在MCU之外增加看门狗芯片,可以检查MCU硬件故障,并恢复。
- 内部看门狗,利用MCU内部自带看门狗,无法检查MCU硬件故障,只能检查软件故障,并恢复。
如何配置
GD32内部自带独立看门狗和窗口看门狗。
- 独立看门狗有独立时钟源,就算主时钟失效,它仍然能正常工作,非常适合需要独立环境而对计时精度要求不高的场景。
- 窗口看门狗适用于需要精确计时的场景
本质上就是一个计数器,配置非常简单,直接上代码了
#define DRV_IWDG_FeedWDog IWDG_ReloadCounter
VOID DRV_IWDG_Init(VOID)
{
/* Enable write access to IWDG_PSR and IWDG_RLDR registers */
IWDG_Write_Enable(IWDG_WRITEACCESS_ENABLE);
/* IWDG counter clock: 40KHz(LSI) / 64 = 0.625 KHz */
IWDG_SetPrescaler(IWDG_PRESCALER_16);
/* Set counter reload value to 625 */
IWDG_SetReloadValue(0x0fff);
/* Reload IWDG counter */
IWDG_ReloadCounter();
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG_Enable();
}
测试结果,如图,当没有喂狗时,系统会不断被狗咬,重启原因如图,喂狗后,系统正常。
代码路径
https://github.com/YaFood/GD32F103/tree/master/TestWDG
https://gitee.com/YaFOOD/GD32F103/tree/master/TestWDG