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上传程序后,会得到以下运行结果:

esp32s3 arduino 看门狗 esp32关闭看门狗_看门狗


已达到原定设计目标, 即5秒触发看门狗的设计目的了。