ESP32看门狗实战
- 1、看门狗与作用
- 2、看门狗程序原理
- 3、看门狗程序设计
- 4、看门狗程序代码
- 5、运行结果
1、看门狗与作用
我们有时会碰到电脑死机的情况 ,这时需要人工进行重启。但MCU也会有死循环的时候。这个时候需要对MCU进行重启,或是执行特殊的操作。看门狗程序就是一种监控程序 ,监测到MCU发生严重错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级,可以防止程序在线运行时候出现死循环。
2、看门狗程序原理
看门狗的程序原理还是比较简单的。它利用一个使用系统时钟的定时器,记录程序执行的时长。当程序执行的时长超过设置的值时,会产生一个重启的命令,或是执行特殊的操作。
当程序正常执行时 ,每一个执行循环,程序都会对计时器进行复位(喂狗),使看门狗程序不会被确发。当程序陷入了死循环时,将无法执行计时器的复位操作。这样看门狗超过时间没人投喂,就会触发重启动作了。
3、看门狗程序设计
本次看门狗程序目标为:
1)设置看门狗时间启动时间为5s。
2)主程序为一个delay函数, 初始循环值为1秒,然后对计时器进行复位。每一次循环后等待时间增加1秒。
3)当循环到第5次时,复位时间要大于看门狗启动时间。看门狗将被触发。
4、看门狗程序代码
int counter1 = 0; //循环计时值,用于计算等待时长
hw_timer_t *tim1 = NULL; //声明看门狗指针变量
int counter1 = 0; //循环计时
// 中断函数
void tim1Interrupt()
{
Serial.println("time out");
esp_restart();
}
// 初始化
void setup()
{
Serial.begin(9600);
tim1 = timerBegin(1, 80, true);
timerAttachInterrupt(tim1, tim1Interrupt, true);
timerAlarmWrite(tim1,5000*1000,true); // 5s触发
timerAlarmEnable(tim1);
}
// 主函数
void loop()
{
timerWrite(tim1, 0); //喂狗操作,计时器清零
Serial.println("");
counter1 = counter1+ 1000;
Serial.print("delay");
Serial.print(counter1);
Serial.println("ms");
delay(counter1);
}
5、运行结果
对ESP32上传程序后,会得到以下运行结果:
已达到原定设计目标, 即5秒触发看门狗的设计目的了。