搜索
bottom↓
回复: 0

《DNK210使用指南 -CanMV版 V1.0》第十七章 machine.WDT类实验

[复制链接]

出0入234汤圆

发表于 3 天前 | 显示全部楼层 |阅读模式
2.jpg
1)实验平台:正点原子DNK210开发板
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

第十七章 machine.WDT类实验


       在上一章实验中,简单介绍了machine模块以及machine模块中的部分函数,本章将介绍machine模块中的WDT类,即看门狗类。通过本章的学习,读者将学习到machine模块中WDT类的使用。
       本章分为如下几个小节:
       17.1 machine.WDT类介绍
       17.2 硬件设计
       17.3 程序设计
       17.4 运行验证

       17.1 machine.WDT类介绍
       machine.WDT类是machine模块内提供的类,该类主要用于访问和控制Kendryte K210硬件上的看门狗,看门狗主要用于在应用程序崩溃且最终进入不可恢复的状态时重启系统,一旦看门狗被开启,应用程序就应当每间隔一段不超过设定的时间对看门狗进行喂狗操作,否则,看门狗产生一个看门狗超时中断,在看门狗超时中断回调函数中,应用程序还有一次喂狗的机会,若应用程序使用没有对看门狗进行喂狗操作,看门狗将在下一次超时时产生一次看门狗复位,使得系统重新启动。
       machine.WDT类提供了WDT构造函数,用于创建一个WDT对象,WDT构造函数如下所示:
  1. class WDT(id=0, timeout=5000, callback=None, context=None)
复制代码
       通过WDT构造函数可以通过指定参数创建并初始化一个WDT对象。
       id指的是看门狗的编号,可以是WDT.WDT_DEVICE_0或WDT.WDT_DEVICE_1,它们分别对应了Kendryte K210硬件上的看门狗0和看门狗1。
       timeout指的是看门狗的超时时间,即最长的不喂狗超时时间。
       callback指的是在看门狗超时后执行的回调函数。
       context指的是传递给回调函数的参数,可通过WDT.context()方法获取。WDT对象创建成功后,便开始计数。
       需要注意的是,machine模块内的回调函数均在硬件中断的上下文中执行。
       WDT构造函数的使用示例如下所示:
  1. from machine import WDT

  2. def wdt_timeout_cb(wdt):
  3.     print("WDT timeout!")

  4. wdt0 = WDT(id=WDT.WDT_DEVICE_0, timeout=2000, callback=wdt_timeout_cb, context={"id": WDT.WDT_DEVICE_0})
复制代码
       machine.WDT类为WDT对象提供了feed()方法,用于对WDT对象进行喂狗操作,feed()方法如下所示:
  1. WDT.feed()
复制代码
       feed()方法用于对WDT对象进行喂狗操作,进行喂狗操作后,WDT对象的计数将重新开始。
       feed()方法的使用示例如下所示:
  1. from machine import WDT
  2. from time

  3. wdt0 = WDT(WDT.WDT_DEVICE_0, timeout=2000)

  4. while True:
  5.     wdt0.feed()
  6.     time.sleep_ms(1000)
复制代码
       machine.WDT类为WDT对象提供了context()方法,用于获取WDT对象超时时传递给WDT对象超时回调函数的参数,context()方法如下所示:
  1. WDT.context()
复制代码
       context()方法用于获取WDT对象超时时传递给WDT对象超时回调函数的参数,这么一来便可在WDT对象的超时回调函数中获取到WDT对象的指定参数。
       context()方法的使用示例如下所示:
  1. from machine import WDT

  2. def wdt_timeout_cb(wdt):
  3.     context = wdt.context()
  4.     print("WDT%d timeout!" % (context["id"]))

  5. wdt0 = WDT(WDT.WDT_DEVICE_0, 2000, wdt_timeout_cb, {"id": WDT.WDT_DEVICE_0})

  6. while True:
  7.     pass
复制代码
       machine.WDT类为WDT对象提供了stop()方法,用于停止WDT对象的计数,stop()方法如下所示:
  1. WDT.stop()
复制代码
       stop()方法用于停止WDT对象的计数,停止后,WDT对象便不再计数,系统也不会因应用程序没有计数喂狗而重启。
       stop()方法的使用示例如下所示:
  1. from machine import WDT

  2. wdt0 = WDT(WDT.WDT_DEVICE_0, 2000)
  3. wdt0.stop()

  4. while True:
  5.     pass
复制代码

       17.2 硬件设计

       17.2.1 例程功能
       1. 创建一个WDT对象,并配置其超时时间为2000毫秒
       2. 按下KEY0按键可对WDT对象进行喂狗操作
       3. 若喂狗次数达5次,则停止WDT对象并退出

       17.2.2 硬件资源

       1. 独立按键
              KEY0按键 - IO18
       2. 看门狗0

       17.2.3 原理图
       本章实验内容,主要讲解machine.WDT类的使用,无需关注原理图。

       17.3 程序设计

       17.3.1 machine.WDT类
       有关machine.WDT类的介绍,请见第17.1小节《machine.WDT类介绍》。

       17.3.2 程序流程图

第十七章 machine2237.png
图17.3.2.1 machine.WDT类实验流程图

       17.3.3 main.py代码
       main.py中的脚本代码如下所示:
  1. from board import board_info
  2. from fpioa_manager import fm
  3. from maix import GPIO
  4. import time
  5. from machine import WDT

  6. fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
  7. key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)

  8. # WDT超时回调函数
  9. def wdt_timeout_cb(wdt):
  10.     context = wdt.context()
  11.     print("WDT%d timeout!" % (context["id"]))

  12. # 构造WDT对象
  13. wdt0 = WDT(id=WDT.WDT_DEVICE_0, timeout=2000, callback=wdt_timeout_cb, context={"id": WDT.WDT_DEVICE_0})

  14. feed_times = 0
  15. while feed_times < 5:
  16.     if key0.value() == 0:
  17.         time.sleep_ms(20)
  18.         if key0.value() == 0:
  19.             # 对WDT喂狗
  20.             wdt0.feed()
  21.             feed_times += 1
  22.             print("Feed WDT0 %d times." % (feed_times))
  23.             while key0.value() == 0:
  24.                 pass
  25.     time.sleep_ms(10)

  26. # 停止WDT
  27. wdt0.stop()
复制代码
       可以看到,首先是初始化使用的独立按键IO,然后定义了一个函数作为WDT的超时回调函数,函数主要实现了打印输出超时的WDT编号。
       接着是构造了WDT对象,WDT对象使用的是WDT0,且超时时间为2000毫秒,超时回调函数为上面定义的函数,传入的参数为包含了一个键为“id”值为WDT编号的字典。
       再接着就是根据本实验需要实现的功能,以及程序流程图,读取按键状态,并在按键被按下时,对WDT对象进行喂狗操作,且在喂狗达到5次后,停止WDT并结束程序。

       17.4 运行验证
       将DNK210开发板连接CanMV IDE,并点击CanMV IDE上的“开始(运行脚本)”按钮后,此时,若连续在2000毫秒间隔内按下板载的KEY0按键进行喂狗操作,则能看到“串行终端”窗口打印输出WDT0被喂狗的次数提示,如下图所示:

第十七章 machine3449.png
图17.4.1 “串行终端”窗口打印输出喂狗次数提示

       若喂狗次数达到5次,则脚本程序运行完毕。
       但若没有在2000毫秒内按下板载的KEY0按键进行喂狗操作,则“串行终端”将打印输出WDT超时的提示,并且WDT将在下一次超时时对Kendryte K210进行复位,此时通过CanMV IDE软件能观察到,原本处于“已连接”状态的Kendryte K210设备变为了“未连接”状态,如下图所示:

第十七章 machine3647.png
图17.4.2 设备断开连接

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

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-17 18:27

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

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