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、适当使用抽象来封装底层硬件操作。
总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
ESP32 是一款功能丰富的微控制器,集成了 Wi-Fi 和蓝牙连接功能,适合物联网开发的强大而实惠的平台。ESP32 的主要特点有:
1、处理器:CPU:Xtensa 双核(或单核)32 位 LX6 微处理器,工作频率为 160 或 240 MHz,性能可达 600 DMIPS。超低功耗(ULP)协处理器。
2、内存:520 KiB RAM,448 KiB ROM。
3、无线连接:Wi-Fi:802.11 b/g/n。蓝牙:v4.2 BR/EDR 和 BLE。
4、外设:12 位 SAR ADC 最多支持 18 个通道,2 个 8 位 DAC,10 个触摸传感器,4 个 SPI,2 个 I2S,2 个 I2C,3 个 UART,SD/SDIO/MMC 主机控制器,SDIO/SPI 从设备控制器,以太网 MAC 接口,CAN 总线 2.0,红外远程控制器,电机 PWM,LED PWM 最多支持 16 通道。
4、安全性:硬件加速 AES、SHA-2、RSA、ECC、随机数生成器(RNG)等。
5、可靠性:工作温度范围为 –40°C 到 +125°C。具有动态电压调整和时钟门控等功能,可适应外部条件的变化和降低功耗。
6、灵活性:可作为独立系统运行应用程序或作为主机 MCU 的从设备,通过 SPI / SDIO 或 I2C / UART 接口提供 Wi-Fi 和蓝牙功能。具有高度集成的天线开关、RF balun、功率放大器、低噪声放大器、滤波器和电源管理模块等。
WDT(看门狗定时器)是一种用于在应用程序崩溃并进入不可恢复状态时重新启动系统的功能。一旦启动,它不能以任何方式停止或重新配置。启用后,应用程序必须定期“喂狗”(feed),以防止WDT超时并重置系统。
WDT的主要特点有:
可以使用machine模块中的WDT类来创建和控制WDT对象。
可以在创建WDT对象时指定超时时间,单位为毫秒。一旦创建,超时时间不能改变。
可以使用feed方法来重置WDT的计数器,防止其触发重启。
可以使用cancel方法来取消正在运行的WDT,但只有在ESP32上可用。
可以使用irq方法来创建一个由WDT触发的中断对象,并指定一个回调函数,在中断发生时执行。
WDT的应用场景有:
在需要保证系统稳定性和可靠性的情况下,使用WDT来监测应用程序是否正常运行,如果出现死循环、死锁或其他异常情况,及时重启系统,恢复正常状态。
在需要定期执行某些任务或操作的情况下,使用WDT来作为一个简单的定时器,通过设置合适的超时时间和喂狗频率,实现周期性的触发和执行。
在需要在重启前执行某些清理或保存工作的情况下,使用WDT的中断功能,在中断回调函数中完成所需的操作,然后再让系统重启。
WDT需要注意的事项有:
在使用WDT之前,需要先导入machine模块,并创建WDT对象。
在使用WDT时,需要注意合理地设置超时时间和喂狗频率,避免过于频繁或过于稀少地重启系统,影响系统性能和用户体验。
在使用WDT时,需要注意在合适的位置喂狗,确保只有在验证一切正常运行后才喂狗,否则可能会掩盖一些潜在的问题或错误。
以下是MicroPython的ESP32 WDT(看门狗定时器)几个实际运用程序参考代码案例:
案例1:使用WDT来监测一个可能会出现死循环的函数,并在出现异常时重启系统:
from machine import WDT
import time
# 创建一个可能会出现死循环的函数
def risky_function():
# 生成一个随机数
n = urandom.randint(0, 9)
# 如果随机数是0
if n == 0:
# 进入死循环
while True:
pass
# 如果随机数不是0
else:
# 打印随机数
print(n)
# 创建一个WDT对象,并设置超时时间为5秒
wdt = WDT(timeout=5000)
# 循环调用可能会出现死循环的函数
while True:
# 调用函数
risky_function()
# 喂狗
wdt.feed()
# 等待1秒
time.sleep(1)
案例2:使用WDT来作为一个定时器,在每隔10秒钟打印一条消息:
from machine import WDT
import time
# 创建一个WDT对象,并设置超时时间为10秒
wdt = WDT(timeout=10000)
# 循环执行
while True:
# 打印一条消息
print('Hello, world!')
# 喂狗
wdt.feed()
# 等待9秒
time.sleep(9)
案例3:使用WDT的中断功能,在重启前保存一些数据到文件中:
from machine import WDT
import uos
# 创建一个WDT对象,并设置超时时间为10秒
wdt = WDT(timeout=10000)
# 定义一个回调函数,在中断发生时执行
def irq_handler(irq):
# 打印一条消息
print('WDT triggered!')
# 打开一个文件
f = uos.open('data.txt', 'w')
# 写入一些数据
f.write('Some important data')
# 关闭文件
f.close()
# 创建一个IRQ对象,由WDT触发
wdt.irq(trigger=WDT.ALARM0, handler=irq_handler)
# 循环执行
while True:
# 做一些事情
pass
案例4:简单的看门狗定时器重启:
import machine
# 配置看门狗定时器
wdt = machine.WDT()
# 触发看门狗定时器重启
wdt.feed()
这个示例演示了如何在MicroPython中使用ESP32的看门狗定时器。首先创建一个WDT对象,然后调用feed()方法来喂狗,即重置看门狗定时器的计时器。通过定期喂狗,可以避免看门狗定时器超时而导致系统重启。
案例5:使用看门狗定时器进行异常处理:
import machine
import sys
# 配置看门狗定时器
wdt = machine.WDT(timeout=5000) # 设置看门狗超时时间为5秒
try:
# 执行可能引发异常的代码
# ...
# 如果代码执行成功,喂狗重置定时器
wdt.feed()
except Exception as e:
# 发生异常时的处理逻辑
print("发生异常:", str(e))
# ...
# 重启系统
sys.exit()
这个示例演示了如何在MicroPython中使用看门狗定时器进行异常处理。首先创建一个WDT对象,并通过timeout参数设置看门狗定时器的超时时间为5秒。然后在try-except块中执行可能引发异常的代码。如果代码执行成功,通过调用feed()方法喂狗,重置看门狗定时器。如果发生异常,可以在except块中进行适当的处理,并最终使用sys.exit()重新启动系统。
案例6:配置看门狗定时器的超时回调函数:
import machine
# 配置看门狗定时器
wdt = machine.WDT(timeout=5000)
# 自定义超时回调函数
def wdt_timeout():
print("看门狗定时器超时!发生了异常情况。")
# 进行异常处理或其他操作
# ...
# 设置超时回调函数
wdt.irq(trigger=machine.WDT.IRQ_TIMEOUT, handler=wdt_timeout)
这个示例演示了如何配置MicroPython中ESP32的看门狗定时器的超时回调函数。首先创建一个WDT对象,并通过timeout参数设置看门狗定时器的超时时间为5秒。然后定义一个自定义的超时回调函数wdt_timeout(),该函数在看门狗定时器超时时会被调用。最后使用irq()方法将超时回调函数与看门狗定时器的超时触发事件关联起来。看门狗定时器是一种用于监控系统运行状态并在发生异常情况时重启系统的机制。在使用看门狗定时器时,需要根据具体应用场景和需求进行适当的配置和处理。同时,谨慎使用看门狗定时器,确保其在适当的时机被喂狗,以预防误触发系统重启。
案例7:配置和启动看门狗定时器:
import machine
# 配置WDT
wdt_timeout_ms = 5000 # 超时时间为5000毫秒
wdt = machine.WDT(timeout=wdt_timeout_ms)
# 启动WDT
wdt.feed()
在上述示例中,我们使用machine.WDT()初始化ESP32的WDT对象,并通过设置timeout参数指定超时时间(以毫秒为单位)。然后,我们调用wdt.feed()来喂狗,即重置WDT计时器,以避免触发看门狗定时器超时重启。
案例8:触发看门狗定时器超时重启:
import machine
# 配置WDT
wdt_timeout_ms = 5000 # 超时时间为5000毫秒
wdt = machine.WDT(timeout=wdt_timeout_ms)
# 人为制造WDT超时重启
while True:
pass
在上述示例中,我们使用machine.WDT()初始化ESP32的WDT对象,并通过设置timeout参数指定超时时间。然后,我们进入一个无限循环,使程序无法正常执行。这将导致看门狗定时器超时,并触发ESP32的重启。
案例9:禁用看门狗定时器::
import machine
# 禁用WDT
wdt = machine.WDT(0)
在上述示例中,我们使用machine.WDT()初始化ESP32的WDT对象,并将timeout参数设置为0。这将禁用看门狗定时器,防止其触发超时重启。请注意,timeout参数为0是禁用WDT的常用方法,但实际超时时间可能因具体的MicroPython版本和硬件平台而有所不同。请查阅相关文档以了解您所使用的具体MicroPython版本和硬件平台的禁用WDT方法。
请特别注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。