ESP32 MicroPython 调整分区大小

Posted

技术标签:

【中文标题】ESP32 MicroPython 调整分区大小【英文标题】:ESP32 MicroPython resize partitions 【发布时间】:2021-07-29 16:44:33 【问题描述】:

我正在使用 ESP32 和带有 Mu 的 MicroPython。 我的代码需要更多闪存空间,通常我会在 Arduino 菜单中选择“Huge APP”,这样会删除 OTA 和 spiff。

如何使用 MicroPython 固件做到这一点?我可以想象,可以通过终端,使用 esptool.py 或 Ampy,但无法弄清楚。

谢谢

【问题讨论】:

【参考方案1】:

在 MicroPython 中更改分区没有简单的方法。您将需要修改分区 表并从源代码编译 MicroPython。这是设置 MicroPython 构建的方法 环境使用 Ubuntu 20.04.2。您可以使用适用于 Linux 版本 2 的 Ubuntu 的 Windows 子系统 20.04.2 也是如此。

如果您使用的是新安装的 Ubuntu 或 Windows,请使用 apt-get 更新和升级 Ubuntu Linux 子系统。

sudo apt-get -y update
sudo apt-get -y upgrade

使用 apt-get 安装所需的构建工具。

sudo apt-get -y install build-essential libffi-dev git pkg-config cmake virtualenv python3-pip python3-virtualenv

使用 git 克隆 esp-idf SDK repo 并安装 -- 这需要一段时间。

git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf/
./install.sh

获取 esp-idf export.sh 脚本以设置所需的环境变量。重要的是 您获取文件而不是使用 ./export.sh 运行它。您需要先获取此文件 编译 MicroPython。

source export.sh
cd ..

使用 git 克隆 MicroPython 存储库。

git clone https://github.com/micropython/micropython.git

更新 git 子模块并编译 MicroPython 交叉编译器

cd micropython/
git submodule update --init
cd mpy-cross/
make
cd ..
cd ports/esp32

您可以通过编辑 ports/esp32 中的partitions.csv 文件来更改 ESP32 分区大小。那里 在更改 partitions.csv 文件时,您应该注意一些事项。 factory partition 是 MicroPython 应用程序所在的位置。这个分区必须足够大 MicroPython 固件,它必须放置在与 0x10000 (64K) 对齐的偏移处。 vfs 分区 是虚拟文件系统所在的位置。

通用 partitions.csv 文件针对 4MB 闪存设备配置,如下所示:

默认 partitions.csv 文件内容

# Notes: the offset of the partition table itself is set in
# $IDF_PATH/components/partition_table/Kconfig.projbuild.
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 0x180000,
vfs,      data, fat,     0x200000, 0x200000,

factory 分区从 0x10000(根据需要对齐到 64K)开始,大小为 0x180000。 这会将factory 分区的末尾放置在 (0x10000 + 0x180000) 或 0x190000 处。下一个 分区是vfs 分区,它从 0x200000 (2MB) 开始,大小为 0x200000 (2MB)。这 在factory 分区结束和vfs 分区开始之间留下 0x200000 - 0x190000 = 0x70000 或 448K 字节未使用的闪存。将未使用的闪存添加到factory 分区 导致新的factory 分区大小为 0x180000 + 0x70000 = 0x1F0000 或 64K 小于 2MB。

修改 partitions.csv 文件内容

# Notes: the offset of the partition table itself is set in
# $IDF_PATH/components/partition_table/Kconfig.projbuild.
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 0x1F0000,
vfs,      data, fat,     0x200000, 0x200000,

如果需要更多的“工厂”闪存空间,您可以减小vfs 分区的大小并 将其偏移量增加相同的量,然后将新释放的空间添加到工厂分区。

修改了 3MB 工厂分区和 960K 虚拟文件系统的 partitions.csv 文件内容 分区。

# Notes: the offset of the partition table itself is set in
# $IDF_PATH/components/partition_table/Kconfig.projbuild.
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 0x300000,
vfs,      data, fat,     0x310000, 0xF0000,

确定分区大小后,构建 MicroPython 固件。

make all

firmware.bin 文件将位于 build-GENERIC 目录中。如果您一直在运行其他 固件或已修改分区表,您必须在将新固件刷新到之前擦除 你的设备。设置 PORT= 为 ESP32 的 USB 串口。

make PORT=/dev/ttyUSB0 erase
make PORT=/dev/ttyUSB0 deploy

此时,您应该使用新的分区大小在 ESP32 设备上运行 MicroPython。 您可以使用以下方法通过 USB 端口连接到 REPL:

make PORT=/dev/ttyUSB0 monitor

【讨论】:

【参考方案2】:

最简单的选择是使用带有 SPIRAM 的 ESP32 并使用支持它的固件之一。 虽然 LoBo 是第一个,但现在大多数 MicroPython 家族都很好地支持它。

https://micropython.org/download/esp32/

通用SPIRAM:esp32spiram-20210418-v1.15.bin

【讨论】:

【参考方案3】:

我一直在搞同样的事情,只是还没有真正做到。

我在这里找到了用于不同固件内容的选项: https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo

您可以选择一些预构建的固件选项,我发现它们的大部分内容非常有用。

如果这不是您想要的,我认为您需要使用 esptool 中的选项更改分区布局。

首先确保您使用的 ESP 具有正确的闪存大小分配。 (有些可以有我找到的外部芯片,不知道你用的是什么板)

我以前从未这样做过,所以我没有资格向您提供有关它的信息。

【讨论】:

LoBo 前叉很棒,但目前相当陈旧,不再维护。大多数(但不是全部)功能现已进入维护良好的家庭。

以上是关于ESP32 MicroPython 调整分区大小的主要内容,如果未能解决你的问题,请参考以下文章

怎样调整esp分区大小

ESP32 MicroPython开发之旅

ESP32 MicroPython开发之旅

ESP32CAM-Micropython-web视频

基于ESP32学习MicroPython: 安装MicroPython固件

MicroPython ESP32Http Get方法获取网络时间+OLED显示