参考了很多网上的关于ESP32看门狗文章,很多设置不正确,看门狗不起作用!无意间在Arduino软件的示例程序中翻到个Watchdog例程,打工一看,恍然大悟,原来就是个定时中断嘛!只不过中断程序执行一条复位指令就行了!我去,我以前认识中都觉得看门狗应该是独立的一个硬件,就只能看门,根本就没想他也可以是一个定时器!
但软件中那个例程不够让我满意,干脆做个看门狗封装,方便以后使用.程序非常简单,有注释,大家一看就明白了.下面贴出代码,欢迎批评指正.
模块文件:Watchdog.c
/*
* ESP32看门狗对象使用方法:
* 1、引用对象定义文件(本文件):#include "Watchdog.C"
* 2、申明看门狗对象变量:WATCHDOG Watchdog;
* 3、初始化对象:Watchdog.begin();//默认使用定时器0,10秒超时。//也可以Watchdog.begin(1,1000);//指定定时器和超时时间。
* 4、喂狗:Watchdog.feed();
*/
#ifndef ESP_RT_WDT_H //避免重复定义.
#define ESP_RT_WDT_H
#include "esp_system.h"
class WATCHDOG {
private:
hw_timer_t *timer = NULL;//定时器对象.
uint8_t Timerindex=0;//硬件定时器编号.默认定时器0.
uint16_t Timeout=10000;//定时器计数.默认10秒超时.
protected:
static void Callback(){
//定时器溢出回调函数,直接复位.
esp_restart();
}
void Init(){
if(timer!=NULL){timerEnd(timer);}//如果之前有设置过定时器,则关闭相应的定时器.
timer=timerBegin(Timerindex,80,true);//使用硬件定时器,预分频80,向上计数。
timerAttachInterrupt(timer,Callback,true);//设置回调函数,边延触发。
timerAlarmWrite(timer,Timeout*1000,true);//设定中断计数器值,自动重启计数(循环定时)。CPU主频80MHz/80/1000=1毫秒。
timerAlarmEnable(timer);//开启定时器。
}
public:
WATCHDOG(){Timerindex=0;Timeout=10000;}
void begin(){Init();}
void begin(uint8_t Esp_Timerindex,uint16_t Esp_Timerout){Timerindex=Esp_Timerindex,Timeout=Esp_Timerout;begin();}
void feed(void){timerWrite(timer,0);}//喂狗.
};
#endif
验证程序文件Watchdog.ino
#include "Watchdog.C"
uint8_t button=0;//按键IO--D0(GPIO0)
WATCHDOG Watchdog;//看门狗对象.
void setup() {
Serial.begin(115200);//串口波特率.
Serial.println("系统复位!");//打印启动信息,以指示模块已经复位.
pinMode(button,INPUT_PULLUP);//按键IO输入模式.
Watchdog.begin();//默认定时器0,10秒超时.
//Watchdog.begin(1,1000);//看门狗初始化,使用定时器1,1秒超时.
}
void loop() {
Watchdog.feed();//喂狗.
long loopTime = millis();
while (!digitalRead(button)) {;}//如果按键超过设定时间,则会因来不及喂狗而超时.
loopTime=millis()-loopTime;
if(loopTime>1){Serial.printf("\r\n按键时间:%d毫秒.",loopTime);}//按键未超时则显示按键所用时间.
}
如果按键超时,就全重启,