WATCHDOG 设备
WATCHDOG 简介
硬件看门狗(watchdog timer)是一个定时器,其定时输出连接到电路的复位端。在产品化的嵌入式系统中,为了使系统在异常情况下能自动复位,一般都需要引入看门狗。
当看门狗启动后,计数器开始自动计数,在计数器溢出前如果没有被复位,计数器溢出就会对 CPU 产生一个复位信号使系统重启(俗称 “被狗咬”)。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零(俗称“喂狗“),不让复位信号产生。如果系统不出问题,程序能够按时“喂狗”。一旦程序跑飞,没有“喂狗”,系统“被咬” 复位。
一般情况下软件可配置该模块使能或去使能。
访问看门狗设备
应用程序根据提供的库函数接口来访问看门狗硬件,相关接口如下所示:
函数名称 | 描述 |
---|---|
extern void wdt_init(); |
初始化看门狗设备 |
extern void wdt_enable(); |
使能看门狗设备 |
extern void wdt_disable(); |
关闭看门狗设备 |
extern void wdt_feed(); |
喂食看门狗设备 |
初始化看门狗
使用看门狗设备之前,必须执行初始化操作,使用下列函数来初始化看门狗设备:
void wdt_init(WDG_TYPE* WDG, uint32_t period_ms);
喂食看门狗
定期喂食看门狗,让系统正常运行,使用下列函数来初始化看门狗:
void wdt_feed(WDG_TYPE *WDG);
使能看门狗
当应用程序初始完看门狗后,使用下列函数来使能看门狗:
void wdt_enable(WDG_TYPE *WDG);
关闭看门狗
当应用程序完成看门狗操作后,可以关闭看门狗设备,通过下列函数完成:
void wdt_disable(WDG_TYPE *WDG);
看门狗设备使用实例
- 初始化设备并设置看门狗溢出时间。
- 使能看门狗。
- 喂狗一次:系统在初始化后需要喂狗一次才能正常运行。
- 喂狗:在溢出时间之前进行操作。
#include <stdio.h>
#include "pulpino.h"
#include "watchdog.h"
int main(int argc, char **argv)
{
printf("wdt begin\r\n");
wdt_init(UC_WATCHDOG, 1000);//1s
wdt_enable(UC_WATCHDOG);
for (int i = 0;i < 5; i++)
{
delay_ms(500);
wdt_feed(UC_WATCHDOG);
printf("wdt feed\r\n");
}
printf("wdt end\r\n");
while(1)
{
asm("nop");
}
while(1);
return 0;
}
注意事项:
- UC8088 看门狗计数器使用32.768KHz时钟为计数器源时钟,因此,即使系统处于SLEEP状态也依然会保持计数。
- 最大计数周期为2^32 * period(32.768KHz) 约等于 131072 秒。