当前位置:   article > 正文

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

esp32c3 micropython 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-C3是一款由乐鑫科技开发的物联网芯片,它具有以下主要特性:

搭载 RISC-V 32 位单核处理器,时钟频率高达 160 MHz,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE)。
内置 400 KB SRAM,384 KB ROM,支持最大 16 MB 的外置 Flash。
集成了天线开关、射频巴伦、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能,仅需要 20 余个外围元件。
具有 22 个可编程 GPIO 管脚,支持 ADC、SPI、UART、I2C、I2S、RMT、TWAI 和 PWM。
具有完善的安全机制,包括安全启动、Flash 加密、数字签名和 HMAC 外设、世界控制器模块等。
沿用乐鑫成熟的物联网开发框架 ESP-IDF,支持 Arduino 和 MicroPython 等开源平台。

在这里插入图片描述
MicroPython的ESP32-C3具有WDT(看门狗定时器)功能,下面是对ESP32-C3 WDT的主要特点、应用场景以及需要注意的事项的详细解释:

主要特点:

系统监控:WDT是一种用于监控系统运行状态的定时器,可在系统出现故障或死锁情况下进行自动重启。它能够检测到系统停止响应或异常情况,并采取预定义的操作来恢复系统的正常运行。

定时器配置:ESP32-C3的WDT可以通过设置预定的定时器值来配置定时器的超时时间。一旦超过设定的时间,WDT将触发系统重启。

低功耗模式:WDT可以在系统进入低功耗模式时继续运行,确保即使在低功耗状态下,系统仍能进行监控和恢复。

多级监控:ESP32-C3的WDT支持多级监控,可以设置不同级别的超时时间。这使得可以对不同功能模块或任务设置不同的超时值,以满足各个模块的需求。

应用场景:

嵌入式系统:WDT广泛应用于嵌入式系统中,特别是对系统可靠性和稳定性要求较高的应用。它可以监控系统运行状态,防止系统死锁或故障,并在发生异常时自动重启系统。

实时应用:WDT对于实时应用非常重要,特别是在需要保证系统响应及时性的场景下。通过定时监控系统状态,WDT可以及时检测到系统停止响应的情况,并采取措施以确保系统的持续运行。

安全关键应用:在安全关键应用中,WDT的作用尤为重要。例如,航空航天、医疗设备和工业自动化等领域,WDT可以用于监控系统运行状态,确保系统始终处于可控状态。

长时间运行系统:对于需要长时间运行的系统,WDT可以作为一个保障机制,监控系统的运行状态,防止由于软件或硬件故障导致系统长时间停止响应。

需要注意的事项:

定时器设置:在使用WDT时,需要合理设置定时器的超时时间。超时时间应根据系统的需求和响应时间来确定,过短的时间可能导致系统频繁重启,而过长的时间则可能延迟系统对异常情况的响应。

定时器喂狗:为了防止WDT触发系统重启,需要定期喂狗(重新加载定时器值),以表示系统正常运行。喂狗的时间间隔应根据系统的需求和实际运行情况来确定。

异常处理:当WDT触发系统重启时,需要进行适当的异常处理,以确保系统在重启后能够正常恢复运行。这可能涉及到状态保存、错误日志记录等操作。

低功耗模式管理:在使用WDT时,需要注意低功耗模式的管理。确保WDT能够在系统进入低功耗模式时继续运行,并在恢复时正确处理。

总结:MicroPython的ESP32-C3 WDT(看门狗定时器)具有系统监控、定时器配置、低功耗模式和多级监控等特点。它适用于嵌入式系统、实时应用、安全关键应用和长时间运行系统等场景。在使用WDT时,需要注意定时器设置、定时器喂狗、异常处理和低功耗模式管理等事项,以确保系统的可靠性和稳定性。

案例一:WDT 定时器

from machine import WDT
import time

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

while True:
    print("WDT 定时器运行中...")
    time.sleep(2)  # 每隔2秒打印一次
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

要点解读:这个程序创建了一个WDT定时器对象,并设置了超时时间为10秒。在无限循环中,每隔2秒打印一次"WDT 定时器运行中…"。当程序运行时间超过10秒时,WDT定时器会触发一个中断,从而重置系统。

案例二:WDT 定时器与重启

from machine import WDT, reset
import time

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

while True:
    print("WDT 定时器运行中...")
    time.sleep(2)  # 每隔2秒打印一次
    wdt.feed()  # 喂狗,重置WDT定时器

# 如果需要重启,调用reset()函数
# reset()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

要点解读:这个程序与上一个程序类似,但是在无限循环中加入了wdt.feed()来喂狗,以重置WDT定时器。同时,还提供了一个注释掉的reset()函数调用,用于在需要时重启系统。

案例三:WDT 定时器与错误处理

from machine import WDT, reset
import time

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

try:
    while True:
        print("WDT 定时器运行中...")
        time.sleep(2)  # 每隔2秒打印一次
        wdt.feed()  # 喂狗,重置WDT定时器
except Exception as e:
    print("发生错误:", e)
    wdt.feed()  # 发生错误时,也需要重置WDT定时器
    reset()  # 重启系统
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

要点解读:这个程序在无限循环中加入了异常处理,当发生错误时,会捕获异常并打印错误信息。同时,在异常处理中也调用了wdt.feed()和reset()函数,以确保WDT定时器被重置并重启系统。

案例四:设置WDT并在超时后重启设备
在这个程序中,我们将设置WDT并在超时后重启设备。首先,我们需要导入machine模块,然后初始化WDT并设置超时时间。在主循环中,我们使设备休眠以节省电量,并使用wdt_reset函数重置WDT。如果在休眠期间WDT超时,设备将重启。

import machine  
import time  
  
# 初始化WDT  
wdt = machine.Watchdog()  
# 设置WDT超时时间  
wdt.timeout(30) # 设置30秒超时时间  
# 主循环  
while True:  
    # 让设备休眠以节省电量  
    machine.idle()  
    # 重置WDT,防止它在休眠期间超时  
    wdt.reset()  
    # 休眠一段时间,例如5秒  
    time.sleep(5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

要点解读:这个程序通过使用WDT来控制设备的重启。在主循环中,我们使设备进入休眠状态以节省电量,并定期重置WDT以防止它在休眠期间超时。如果在休眠期间WDT超时,设备将重启。这对于需要延长设备使用寿命的应用程序非常有用。

案例五:使用WDT实现简单的延迟
在这个程序中,我们将使用WDT实现一个简单的延迟。首先,我们需要导入machine和time模块,然后初始化WDT并设置超时时间。在主循环中,我们使设备休眠一段时间,然后使用wdt_reset函数重置WDT。这个程序利用了WDT在设备休眠期间不会超时的特性来实现延迟。

import machine  
import time  
  
# 初始化WDT  
wdt = machine.Watchdog()  
# 设置WDT超时时间  
wdt.timeout(10) # 设置10秒超时时间  
# 主循环  
while True:  
    # 让设备休眠一段时间来实现延迟,例如2秒  
    machine.idle()  
    time.sleep(2)  
    # 重置WDT  
    wdt.reset()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

要点解读:这个程序通过使用WDT来实现延迟。在主循环中,我们使设备进入休眠状态一段时间来实现延迟,并定期重置WDT以防止它在休眠期间超时。这个方法可以用于需要定时唤醒设备的场景。

案例六:使用WDT实现简单的定时任务
在这个程序中,我们将使用WDT实现一个简单的定时任务。首先,我们需要导入machine和time模块,然后初始化WDT并设置超时时间。在主循环中,我们使设备休眠一段时间,然后在每次唤醒时执行一个简单的任务(例如打印一条消息)。然后使用wdt_reset函数重置WDT。这个程序利用了WDT在设备休眠期间不会超时的特性来实现定时任务。

import machine  
import time  
  
# 初始化WDT  
wdt = machine.Watchdog()  
# 设置WDT超时时间  
wdt.timeout(10) # 设置10秒超时时间  
# 主循环  
while True:  
    # 让设备休眠一段时间来实现延迟,例如2秒  
    machine.idle()  
    time.sleep(2)  
    # 执行一个简单的任务,例如打印一条消息  
    print("Hello, world!")  
    # 重置WDT  
    wdt.reset()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

案例七:简单的看门狗定时器重置

import machine

wdt = machine.WDT(timeout=5000)

while True:
    # 重置看门狗定时器
    wdt.feed()
    # 执行其他任务...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

要点解读:
代码使用machine.WDT()创建一个看门狗定时器对象,并设置超时时间为5000毫秒(5秒)。
在循环中,通过wdt.feed()重置看门狗定时器,避免触发看门狗定时器超时重启。
在wdt.feed()之后,可以执行其他任务或代码逻辑。

案例八:看门狗定时器异常处理

import machine
import time

wdt = machine.WDT(timeout=5000)

while True:
    try:
        # 执行一些可能会发生异常的任务...
        time.sleep(1)
        # 重置看门狗定时器
        wdt.feed()
    except Exception as e:
        # 处理异常并重置看门狗定时器
        print("Exception occurred:", str(e))
        wdt.feed()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

要点解读:
代码使用machine.WDT()创建一个看门狗定时器对象,并设置超时时间为5000毫秒(5秒)。
在循环中,通过try-except块执行一些可能会发生异常的任务。
在任务执行完成后,通过wdt.feed()重置看门狗定时器,避免触发看门狗定时器超时重启。
如果发生异常,可以在except块中处理异常并重置看门狗定时器。

案例九:看门狗定时器超时重启

import machine

wdt = machine.WDT(timeout=5000)

while True:
    # 不重置看门狗定时器,让其超时触发重启
    pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

要点解读:
代码使用machine.WDT()创建一个看门狗定时器对象,并设置超时时间为5000毫秒(5秒)。
在循环中,没有重置看门狗定时器,让其超时触发重启。
这个示例主要展示了看门狗定时器的超时重启功能,一旦看门狗定时器超时,ESP32-C3会自动重启。

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/196078
推荐阅读
相关标签
  

闽ICP备14008679号