esp32 — 特定于 ESP32 的功能

esp32模块包含专门用于控制 ESP32 模块的函数和类。

职能

esp32.wake_on_touch(wake)

配置触摸是否将设备从睡眠中唤醒。 唤醒应该是一个布尔值。

esp32.wake_on_ext0(pin, level)

配置 EXT0 如何将设备从睡眠中唤醒。 pin可以是 None 一个有效的 Pin 对象。 级别应该是esp32.WAKEUP_ALL_LOWesp32.WAKEUP_ANY_HIGH

esp32.wake_on_ext1(pins, level)

配置 EXT1 如何将设备从睡眠中唤醒。 pin可以是None 有效 Pin 对象的元组/列表。 级别应该是 esp32.WAKEUP_ALL_LOWesp32.WAKEUP_ANY_HIGH

esp32.raw_temperature()

读取内部温度传感器的原始值,返回一个整数。

esp32.hall_sensor()

读取内部霍尔传感器的原始值,返回一个整数。

esp32.idf_heap_info(capabilities)

返回有关 ESP-IDF 堆内存区域的信息。其中一个包含 MicroPython 堆,其他的由 ESP-IDF 使用,例如用于网络缓冲区和其他数据。此数据有助于了解 ESP-IDF 和网络堆栈的可用内存量。它可能会阐明 ESP-IDF 操作由于分配失败而失败的情况。返回的信息对解决 Python 分配失败没有用,请micropython.mem_info()改用。

能力参数对应于 ESP-IDF 的 MALLOC_CAP_XXX值,但两个最有用的参数是预定义的,esp32.HEAP_DATA 用于数据堆区域和esp32.HEAP_EXEC 本地代码发射器使用的可执行区域。

返回值是一个 4 元组列表,其中每个 4 元组对应一个堆并包含:总字节数、空闲字节数、最大空闲块和随着时间推移看到的最小空闲区。

启动后示例:

>>> import esp32; esp32.idf_heap_info(esp32.HEAP_DATA)
[(240, 0, 0, 0), (7288, 0, 0, 0), (16648, 4, 4, 4), (79912, 35712, 35512, 35108),
 (15072, 15036, 15036, 15036), (113840, 0, 0, 0)]

闪存分区

此类允许访问设备闪存中的分区,并包括启用无线 (OTA) 更新的方法。

class esp32.Partition(id)

创建一个表示分区的对象。 id可以是一个字符串,它是要检索的分区的标签,或常量之一:BOOTRUNNING.

classmethod Partition.find(type=TYPE_APP, subtype=255, label=None)

查找由type、subtype和label指定的分区。返回 Partition 对象的(可能为空)列表。注意:subtype=0xff 匹配任何子类型并label=None匹配任何标签。

Partition.info()

返回一个 6 元组。 (type, subtype, addr, size, label, encrypted).

Partition.readblocks(block_num, buf)
Partition.readblocks(block_num, buf, offset)
Partition.writeblocks(block_num, buf)
Partition.writeblocks(block_num, buf, offset)
Partition.ioctl(cmd, arg)

这些方法实现了定义的简单和 扩展 块协议 uos.AbstractBlockDev

Partition.set_boot()

将分区设置为引导分区。

Partition.get_next_update()

获取此分区之后的下一个更新分区,并返回一个新的 Partition 对象。典型用法是 Partition(Partition.RUNNING).get_next_update() 返回下一个要更新的分区,给定当前正在运行的分区。

classmethod Partition.mark_app_valid_cancel_rollback()

表示当前启动被视为成功的信号。mark_app_valid_cancel_rollback 新分区第一次启动时需要调用,以避免下次启动时自动回滚。这使用带有“CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE”的ESP-IDF“应用程序回滚”功能,OSError(-261)如果在未启用该功能的固件上调用,则会引发。mark_app_valid_cancel_rollback每次启动都可以调用,并且在启动使用 esptool 加载的 Firmare 时没有必要。

常数

Partition.BOOT
Partition.RUNNING

Partition构造函数中用于获取各种分区:BOOT 是将在下次重置时启动的分区,RUNNING 也是当前运行的分区。

Partition.TYPE_APP
Partition.TYPE_DATA

用于 Partition.find 指定分区类型:APP用于可引导固件分区(通常标记为factory, ota_0, ota_1),以及 DATA 用于其他分区,例如 nvs, otadata, phy_init, vfs

esp32.HEAP_DATA
esp32.HEAP_EXEC

用于 idf_heap_info.

RMT

ESP32 专用的 RMT(Remote Control)模块最初设计用于发送和接收红外遥控信号。但是,由于设计灵活且脉冲生成非常准确(低至 12.5ns),它还可以用于传输或接收许多其他类型的数字信号:

import esp32
from machine import Pin

r = esp32.RMT(0, pin=Pin(18), clock_div=8)
r  # RMT(channel=0, pin=18, source_freq=80000000, clock_div=8, idle_level=0)

# To apply a carrier frequency to the high output
r = esp32.RMT(0, pin=Pin(18), clock_div=8, tx_carrier=(38000, 50, 1))

# The channel resolution is 100ns (1/(source_freq/clock_div)).
r.write_pulses((1, 20, 2, 40), 0)  # Send 0 for 100ns, 1 for 2000ns, 0 for 200ns, 1 for 4000ns

RMT 模块的输入是一个 80MHz 时钟(将来它可能能够配置输入时钟,但现在是固定的)。 对决定 RMT 通道分辨率的时钟输入进行clock_div 分频。中指定的数字 write_pulses 乘以分辨率来定义脉冲。

clock_div 是一个 8 位分频器 (0-255),每个脉冲可以通过将分辨率乘以 15 位 (0-32,768) 数来定义。有八个通道 (0-7),每个通道可以有不同的时钟分频器。

因此,在上面的示例中,80MHz 时钟被 8 分频。因此分辨率为 (1/(80Mhz/8)) 100ns。由于start级别为 0 并随每个数字切换,因此比特流的0101 持续时间为 [100ns, 2000ns, 100ns, 4000ns]。

更多详情请参阅乐鑫的 ESP-IDF RMT 文档。

警告

当前的 MicroPython RMT 实现缺少一些功能,最明显的是接收脉冲。RMT 应该被认为是一个 测试版功能,界面可能会在未来发生变化。

class esp32.RMT(channel, *, pin=None, clock_div=8, idle_level=False, tx_carrier=None)

此类提供对八个 RMT 通道之一的访问。channel是必需的,并标识将配置哪个 RMT 通道 (0-7)。pin也是必需的,用于配置哪个 Pin 绑定到 RMT 通道。clock_div 是一个 8 位时钟分频器,它将源时钟 (80MHz) 分频到 RMT 通道,允许指定分辨率。idle_level指定当没有传输正在进行时输出的电平,可以是转换为布尔值的任何值,True代表高电压和 False 低电压。

要启用传输载波功能,tx_carrier应该是三个正整数的元组:载波频率、占空比 (0100) 和应用载波的输出电平(根据idle_level的布尔值 )。

RMT.source_freq()

返回源时钟频率。当前源时钟不可配置,因此这将始终返回 80MHz。

RMT.clock_div()

返回时钟分频器。请注意,通道分辨率为 。 1 / (source_freq / clock_div).

RMT.wait_done(*, timeout=0)

True如果通道空闲或正在传输以False开头的脉冲序列,则返回RMT.write_pulses。如果 给出timeout关键字参数,则阻塞最多毫秒以完成传输。

RMT.loop(enable_loop)

在通道上配置循环。enable_loop是 bool,设置为在下一次调用时True 启用循环。如果在当前正在传输循环序列时调用, 则当前循环迭代将完成,然后传输将停止。RMT.write_pulses False

RMT.write_pulses(duration, data=True)

开始传输序列。有以下三种方式来指定:

模式 1: duration 是一个持续时间列表或元组。可选数据 参数指定初始输出级别。输出电平将在每个持续时间后切换。

模式 2: duration为正整数,data为输出电平列表或元组。持续时间为每个指定一个固定的持续时间。

模式 3: duration 持续时间和数据是长度相等的列表或元组,指定单独的持续时间和每个的输出级别。

持续时间以通道分辨率的整数单位(如上所述)为单位,介于 1 到 32767 个单位之间。输出电平是任何可以转换为布尔值的值,True 代表高电压和 False低电压 。

如果较早序列的传输正在进行中,则此方法将阻塞,直到传输完成,然后才开始新序列。

如果使用 启用循环 RMT.loop,则序列将无限重复。在立即开始循环新的脉冲序列之前,对该方法的进一步调用将阻塞,直到当前循环迭代结束。硬件不支持超过 126 个脉冲的循环序列。

超低功耗协处理器

class esp32.ULP

此类提供对超低功耗协处理器的访问。

ULP.set_wakeup_period(period_index, period_us)

设置唤醒周期。

ULP.load_binary(load_addr, program_binary)

在给定的load_addr处将program_binary加载到 ULP 中。

ULP.run(entry_point)

启动在给定entry_point运行的 ULP 。

常数

esp32.WAKEUP_ALL_LOW
esp32.WAKEUP_ANY_HIGH

选择引脚的唤醒级别。

非易失性存储

此类允许访问由 ESP-IDF 管理的非易失性存储。NVS 被划分为多个命名空间,每个命名空间都包含类型化的键值对。键是字符串,值可以是各种整数类型、字符串和二进制 blob。该驱动程序目前仅支持 32 位有符号整数和 blob。

警告

对 NVS 的更改需要通过调用 commit 方法提交到 flash。未能调用 commit 会导致更改在下次重置时丢失。

class esp32.NVS(namespace)

创建一个对象,提供对命名空间的访问(如果不存在,则会自动创建)。

NVS.set_i32(key, value)

为指定的键设置一个 32 位有符号整数值。记得调用commit!

NVS.get_i32(key)

返回指定键的有符号整数值。如果键不存在或具有不同的类型,则引发 OSError。

NVS.set_blob(key, value)

为指定的键设置二进制 blob 值。传入的值必须支持缓冲协议,例如bytes、bytearray、str。(注意 esp-idf 区分 blob 和字符串,即使字符串作为值传入,此方法也始终写入 blob。)记住调用commit!

NVS.get_blob(key, buffer)

将指定键的 blob 值读入缓冲区,缓冲区必须是字节数组。返回读取的实际长度。如果键不存在、具有不同的类型或缓冲区太小,则引发 OSError。

NVS.erase_key(key)

擦除键值对。

NVS.commit()

将set_xxx方法所做的更改提交到闪存。