【雕爷学编程】MicroPython手册之 ESP32-S3 WDT (Watchdog timer)

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述

总体来说,ESP32-S3在功耗、硬件资源和功能支持方面进行了优化,非常适合作为低功耗物联网设备的处理平台。相比ESP32,ESP32-S3在无线、安全性和稳定性等方面有所提升。

1、搭载 Xtensa® 32 位 LX7 双核处理器,主频 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。
2、支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
3、加入了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions),性能对比 ESP32 有可观的提升。
4、集成 2.4 GHz Wi-Fi (802.11 b/g/n),支持 40 MHz 带宽;其低功耗蓝牙子系统支持 Bluetooth 5 (LE) 和 Bluetooth Mesh,可通过 Coded PHY 与广播扩展实现远距离通信。它还支持 2 Mbps PHY,用于提高传输速度和数据吞吐量。
5、外设新增 LCD 接口、USB、SD/MMC 主机控制器和 TWAI TM 控制器等常用外设接口。
6、拥有完善的安全机制和保护措施,支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。

在这里插入图片描述
MicroPython的ESP32-S3芯片具备看门狗定时器(Watchdog timer,WDT)功能,以下是关于其主要特点、应用场景和需要注意的事项的详细解释:

主要特点:

系统监控:WDT是一种硬件计时器,旨在监控系统的运行状态。它定期计数,并在计数超过预设阈值时触发复位或中断,以防止系统出现意外故障或死锁状态。

安全保护:WDT可用于确保系统的可靠性和稳定性。如果系统发生故障或陷入无限循环等异常情况,WDT可以强制重启系统,避免系统长时间停滞或无响应。

灵活配置:ESP32-S3的WDT可根据应用程序的需求进行灵活配置。可以设置计数阈值、触发复位或中断、选择计时器的时钟源等,以满足不同场景下的监控需求。

应用场景:

系统可靠性:WDT广泛应用于需要高可靠性的系统,如嵌入式系统、网络设备、工控设备等。通过定期喂狗(reset或refresh)操作,WDT可以确保系统在正常运行状态下,并在出现异常情况时及时重启系统。

软件故障监控:WDT可用于监控软件应用程序的运行状态。如果应用程序陷入死循环、堆栈溢出或意外错误,WDT可以检测到并重启系统,以恢复正常运行。

硬件故障检测:WDT还可以用于检测硬件故障或异常情况。例如,当系统供电异常、温度过高或外设通信异常时,WDT可以触发复位,以保护系统免受潜在的损害。

需要注意的事项:

定时配置:在使用WDT时,需要根据应用的需求合理配置计数阈值。如果阈值设置过小,可能会导致误报复位或频繁中断;如果设置过大,可能无法及时检测到系统故障。因此,需要根据系统稳定性和响应时间的要求进行适当的调整。

喂狗操作:为了防止WDT触发复位,需要定期执行喂狗操作。喂狗操作是向WDT发送特定的指令,以重置计时器。应在应用程序中适时执行喂狗操作,确保WDT保持活动状态。

异常处理:当WDT触发复位或中断时,需要适当处理异常情况。可以记录日志、恢复系统状态或执行其他必要的故障处理操作,以确保系统能够正常运行。

注意复位影响:WDT的触发将会导致系统重新启动,因此需要注意复位对系统的影响。在设计和使用WDT时,需要确保系统能够在复位后正确初始化,并能够从先前的状态中恢复。

综上所述,MicroPython的ESP32-S3的WDT具有系统监控、安全保护和灵活配置等特点。它适用于提高系统可靠性、监控软件和硬件故障的应用场景。在使用WDT时,需要注意定时配置、喂狗操作、异常处理和复位影响等方面的问题。

案例一:WDT定时器启动

from machine import WDT
import time

# 初始化WDT,设置超时时间为10秒
wdt = WDT(timeout=10000)

while True:
    # 执行一些任务
    pass

要点解读:在这个案例中,我们首先从machine模块导入了WDT类。然后,我们创建了一个WDT对象,并设置了超时时间为10秒(10000毫秒)。在无限循环中,我们可以执行一些任务,同时WDT计时器也会持续计时。当超过设定的超时时间后,WDT会触发一个中断,从而重置系统。

案例二:WDT定时器停止

from machine import WDT
import time

# 初始化WDT,设置超时时间为10秒
wdt = WDT(timeout=10000)

while True:
    # 执行一些任务
    pass


# 停止WDT计时器
wdt.stop()

要点解读:在这个案例中,我们在无限循环中执行了一些任务。当需要停止WDT计时器时,我们调用了wdt.stop()方法。这将停止WDT计时器,并在下一次WDT中断发生时重置系统。

案例三:WDT定时器重启

from machine import WDT
import time

# 初始化WDT,设置超时时间为10秒
wdt = WDT(timeout=10000)

while True:
    # 执行一些任务
    pass

    # 重启WDT计时器
    wdt.reset()

要点解读:在这个案例中,我们在无限循环中执行了一些任务。当需要重启WDT计时器时,我们调用了wdt.reset()方法。这将重启WDT计时器,并在下一次WDT中断发生时重置系统。

案例四:设置WDT并重启

from machine import WDT  
import time  
  
def set_wdt_and_restart():  
    # 创建一个WDT实例  
    wdt = WDT()  
      
    # 设置WDT超时时间为5秒  
    wdt.feed()  
    time.sleep(5)  # 让WDT超时  
      
    # 重启设备  
    wdt.reset()  
  
set_wdt_and_restart()

这个程序将ESP32-S3的WDT设置为5秒后重启。如果在这5秒内没有喂食WDT(例如,由于死循环或其他资源竞争导致系统冻结),则设备将自动重启。

案例五:WDT中断处理

from machine import WDT, Pin  
import time  
  
# 配置GPIO16为输入,用于检测按键  
pin = Pin(16, Pin.IN)  
  
def wdt_feed_and_print():  
    # 喂食WDT,避免其超时并重启设备  
    wdt.feed()  
    print("WDT feed")  
    time.sleep(1)  # 等待1秒后再次喂食WDT  
  
def on_edge(pin):  # 按键中断处理函数  
    print("Button pressed")  
    # 在按键中断处理函数中喂食WDT,避免其超时并重启设备  
    wdt.feed()  
  
pin.irq(trigger=Pin.IRQ_FALLING, handler=on_edge)  # 配置GPIO16的下降沿中断,并注册中断处理函数on_edge  
while True:  # 主循环,等待按键事件和WDT超时事件  
    wdt_feed_and_print()  # 喂食WDT,避免其超时并重启设备

这个程序将ESP32-S3的WDT与GPIO16的按键中断结合起来。当按键被按下时,将喂食WDT,避免其超时并重启设备。如果未按下按键,WDT将在大约5秒后超时并重启设备。注意,这个程序假设GPIO16已经被配置为输入并且没有上拉或下拉。如果有上拉或下拉电阻,你可能需要调整程序以正确地检测按键状态。

案例六:使用WDT实现简单的看门狗功能

from machine import WDT, time_pulse_us, freq, uarts  
import time  
  
def check_wdt():  
    while True:  # 主循环,检测WDT状态并喂食WDT,避免其超时并重启设备  
        wdt.feed()  # 喂食WDT,避免其超时并重启设备  
        time.sleep(0.01)  # 等待0.01秒,以便CPU有时间执行其他任务  
        if not wdt.is_alive():  # 如果WDT已经超时(即CPU没有喂食WDT),则重启设备  
            wdt.reset()  # 重启设备  
            print("Watchdog reset")  # 打印一条消息,表明设备已经重启了  
            while True:  # 等待设备完全重启并初始化完毕后再次开始主循环  
                pass  # 空循环,等待设备完全重启并初始化完毕后再次开始主循环

在上述的第几个案例中,我们实现了一个简单的看门狗功能。看门狗(Watchdog)是一种在系统出现异常时,能够强制系统重启,从而恢复系统正常运行的机制。在这个案例中,我们使用WDT来实现这个功能。

主循环中的代码会持续检查WDT的状态。如果WDT已经超时(即CPU没有喂食WDT),则说明系统可能出现了异常,此时我们调用wdt.reset()来强制系统重启,并打印一条消息,表明设备已经重启了。

在重启后,设备会重新初始化,然后再次开始主循环。这个过程会一直持续下去,除非手动停止程序或者再次触发WDT超时。

这个看门狗程序的运行时间很短,因为每次喂食WDT后只等待了0.01秒。在实际应用中,你可能需要等待更长的时间来检测WDT是否超时。但是,需要注意的是,等待时间过长可能会影响设备的正常运行,因此需要在测试看门狗功能和设备的正常运行之间找到一个平衡点。

案例七:基本的WDT定时重启:

import machine

wdt = machine.WDT(timeout=5000)  # 设置WDT定时器超时时间为5秒

while True:
    # 执行应用程序逻辑
    # ...

    # 喂狗,重置WDT定时器
    wdt.feed()

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上实现基本的WDT定时重启。
使用machine.WDT()函数创建一个WDT对象,并设置超时时间为5秒。
在一个无限循环中,执行应用程序的逻辑。
在每次循环结束时,通过调用wdt.feed()方法喂狗,重置WDT定时器。如果超过5秒没有喂狗,WDT定时器将触发重启ESP32-S3。

案例八:模拟WDT超时导致重启:

import machine
import utime

wdt = machine.WDT(timeout=5000)  # 设置WDT定时器超时时间为5秒

while True:
    # 执行应用程序逻辑
    # ...

    # 模拟WDT超时
    utime.sleep(6)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上模拟WDT超时导致重启。
使用machine.WDT()函数创建一个WDT对象,并设置超时时间为5秒。
在一个无限循环中,执行应用程序的逻辑。
在模拟WDT超时的位置,通过调用utime.sleep(6)函数让程序休眠6秒,超过了WDT的超时时间。这会导致WDT定时器触发重启ESP32-S3。

案例九:禁用WDT:

import machine

wdt = machine.WDT(timeout=5000)  # 设置WDT定时器超时时间为5秒

# 禁用WDT
wdt.deinit()

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上禁用WDT。
使用machine.WDT()函数创建一个WDT对象,并设置超时时间为5秒。
通过调用wdt.deinit()方法禁用WDT定时器。这将阻止WDT定时器触发重启ESP32-S3。
这些示例展示了如何在ESP32-S3上使用MicroPython编写与看门狗定时器(Watchdog Timer,WDT)相关的代码。通过创建WDT对象,可以设置WDT定时器的超时时间,喂狗来重置定时器,模拟WDT超时导致重启,以及禁用WDT定时器。WDT定时器可用于监控应用程序的运行状态,当应用程序出现异常或停止响应时,WDT定时器可以触发重启以恢复系统的稳定性。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值