搜索
bottom↓
回复: 0

《DNESP32S3使用指南-IDF版_V1.6》第十六章 WATCH_DOG实验

[复制链接]

出0入234汤圆

发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2024-7-18 14:20 编辑

2.jpg
1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
1.png
3.png

第十六章 WATCH_DOG实验

       本章,我们将学习看门狗,基于定时器功能,教大家如何用定时器模拟看门狗功能。
       本章分为如下几个小节:
       16.1 看门狗简介
       16.2 硬件设计
       16.3 程序设计
       16.4 下载验证

       16.1 看门狗简介
       MCU可能工作在一些复杂环境,可能受到某些电磁干扰出现程序跑飞,导致死循环无法继续执行工作,看门狗的作用就是为了避免这种情况。看门狗的本质也是一个定时器,在程序启动后,需要在一定的时间内再给它一个信号,俗称“喂狗”。如果没有按时“喂狗”,说明系统或软件出现了不可预知的问题(比如软件卡在某个循环或逾期事件中),这时看门狗就向系统发送个复位信号,使整个系统重启,重新进入正常的工作状态。看门狗有助于检测、处理系统或软件的错误行为。
       ESP32-S3中有三个数字看门狗定时器、1个模拟看门狗定时器和一个XTAL32K看门狗定时器,他们在各自有特定条件运行。本实验主要用是通用定时器模拟看门狗功能。
本实验用到的函数跟第十四章ESPTIMER实验用到的函数是一致的。

       16.2 硬件设计

       16.2.1 例程功能
       程序运行后,开发板板载的LED因不停的复位而闪烁,但如果按下BOOT按键进行喂狗,那么就不会产生复位,LED也就保持常亮,一旦超过看门狗的溢出时间(Tout=1000毫秒)没有按下BOOT按键进行喂狗,那么就会进行复位,LED也就会熄灭一次。

       16.2.2 硬件资源
       1. LED
              LED - IO1

       2. 按键
              BOOT - IO0

       3. ESPTIMER

       16.2.3 原理图
       本章实验使用的定时器为ESP32-S3的片上资源,因此并没有相应的连接原理图。

       16.3 程序设计

       16.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第十六章 WATCH816.png
图16.3.1.1 WATCH_DOG实验程序流程图

       16.3.2 WATCH_DOG函数解析
       本实验用到的函数跟第十四章ESPTIMER实验使用的定时器是一致的,在此不作出赘述,请读者们参考第十四章的内容。

       16.3.3 WATCH_DOG驱动解析
       在IDF版的07_wdt例程中,作者在07_wdt \components\BSP路径下新增了一个WDT文件夹,用于存放wdt.c和wdt.h这两个文件。其中,wdt.h文件负责声明WDT相关的函数和变量,而wdt.c文件则实现了WDT的驱动代码。下面,我们将详细解析这两个文件的实现内容。

       1,wdt.h文件
  1. /* 引脚定义 */
  2. #define BOOT_INT_GPIO_PIN   GPIO_NUM_0

  3. /*IO操作*/
  4. #define BOOT                gpio_get_level(BOOT_INT_GPIO_PIN)

  5. /* 函数声明 */
  6. void exit_init(void);   /* 外部中断初始化程序 */
复制代码

       2,wdt.c文件
  1. /**
  2. * @brief       初始化任务看门狗计时器
  3. * @param       tps: 定时器周期
  4. */
  5. void esptim_int_init(uint64_t tps)
  6. {
  7.     esp_timer_handle_t esp_tim_handle;                            /* 定时器回调函数句柄 */

  8.     /* 定义一个定时器结构体 */
  9.     esp_timer_create_args_t tim_periodic_arg = {
  10.         .callback = &esptim_callback,                             /* 设置回调函数 */
  11.         .arg = NULL,                                              /* 不携带参数 */
  12.     };

  13.     esp_timer_create(&tim_periodic_arg, &esp_tim_handle);        /* 创建一个事件 */
  14. esp_timer_start_periodic(esp_tim_handle, tps);                /* 每周期内触发一次 */
  15. }

  16. /**
  17. * @brief       重新启动当前运行的计时器
  18. * @param       timeout: 定时器超时时间,该超时时间以微妙作为基本计算单位,
  19. 故而设置超时时间为1s,则需要转换为微妙(μs),
  20. 即timeout = 1s = 1000000μs
  21. * @retval      无
  22. */
  23. void restart_timer(uint64_t timeout)
  24. {
  25. /* 重新启动当前运行的计时器,用以模拟喂狗过程 */
  26.     esp_timer_restart(esp_tim_handle, timeout);
  27. }

  28. /**
  29. * @brief       看门狗回调函数
  30. * @param       arg: 无参数传入
  31. * @retval      无
  32. */
  33. void IRAM_ATTR wdt_isr_handler(void *arg)
  34. {
  35.     esp_restart();  /* 若没有及时进行喂狗,那么芯片将一直进行复位 */
  36. }
复制代码
       WDT的初始化函数中调用了看门狗回调函数,用以模拟当定时器溢出时产生的复位现象。
       同时,我们在restart_timer()函数中调用了esp_timer_restart()。该函数的主要作用在于:当函数在调用时重新启动当前所运行的定时器,用以模拟喂狗过程。对于该函数而言,我们假设给定的计时器为一次性计时器,那么计时器将立即重启,并在timeout_us微秒内超时一次。当假设给定的计时器为周期性计时器,那么立即以新的timeout_us微秒周期重新启动计时器。
       另外,在wdt_isr_handler()中调用了esp_restart()。该函数的主要作用在于将芯片复位,用以模拟程序在没有“喂狗”的情况下跑飞。此函数既可以从PRO中调用,也可以从APPCPU调用。成功重启后,CPU重置原因将为SW_CPU_reset。外设如Wi-Fi、BT、UART0、SPI1和传统定时器除外)不会重置。此函数不会返回。

       16.3.4 CMakeLists.txt文件
       打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:
  1. set(src_dirs            
  2.             KEY
  3.             LED
  4.             WDT)

  5. set(include_dirs
  6.             KEY
  7.             LED
  8.             WDT)

  9. set(requires
  10.             driver
  11. esp_timer)

  12. idf_component_register(SRC_DIRS ${src_dirs}
  13. INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})

  14. component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
复制代码
       上述的红色KEY、WDT驱动需要由开发者自行添加,以确保WDT驱动能够顺利集成到构建系统中。需要注意的是我们的依赖库(requires)需要添加上ESP32-S3定时器定时器的库,这些步骤是必不可少的,它确保了WDT驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。

       16.3.5 实验应用代码
       打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。
  1. /**
  2. * @brief       程序入口
  3. * @param       无
  4. * @retval      无
  5. */
  6. void app_main(void)
  7. {
  8.     esp_err_t rets;
  9.    
  10.     ret = nvs_flash_init();                             /* 初始化NVS */

  11. if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
  12.             ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  13.     {
  14.         ESP_ERROR_CHECK(nvs_flash_erase());
  15.         ret = nvs_flash_init();
  16.     }
  17.    
  18.     led_init();                                                         /* 初始化LED */
  19.     key_init();                                 /* 初始化按键 */
  20.     wdt_init(1000000);                                   /* 初始化定时器 */
  21.     LED(0);                                     /* LED灯常亮 */

  22.     while (1)
  23.     {
  24.         if (key_scan(0) == BOOT_PRES)           /* 如果BOOT按下则喂狗 */
  25.         {
  26.             restart_timer(1000000);             /* 喂狗 */
  27.         }

  28.         vTaskDelay(10);                         /* LED闪烁 */
  29.     }
  30. }
复制代码
       可以看到应用代码中,LED初始化后,LED会处于常亮状态,随后初始化WDT模拟定时器溢出过程,会看见LED在不断闪烁,此时的ESP32-S3芯片处于一直复位状态。接着在while循环中重复判断BOOT按键是否被按下,若按下则进行“喂狗”操作,若在WDT溢出前都为按下BOOT按键,那么就不会产生复位,LED也就保持常亮。

       16.4 下载验证
       在完成编译和烧录操作后,可以看到板子上的LED每间隔一段时间(大约1秒)就闪烁一次,这是因为WDT不断地对芯片进行复位。接下来若以时间间隔小于1秒(大约)的速度频繁地按下BOOT按键,则可以在芯片复位前及时“喂狗”,具体的现象为LED常亮。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-22 20:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表