目前使用的ESP-WROOM-32集成4MB SPI Flash。在编译esp32程序时,通过make menuconfig -> PartitionTable 可以有三种分区选择:工厂程序(无OTA分区)/工厂程序(双OTA分区)/用户自定义分区。

本文以ESP32 4M Flash为例,讲一讲如何用户自定义分区表。

首先下图是一个适用于阿里云物联网平台的分区表:

关于分区图示的说明:

  1. 0x8000之前的地址保存Boot loader。
  2. Partition Table分区:ESP32 在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。该分区表的长度为 0xC00 字节(最多可以保存 95 条分区表条目)。分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了安全启动功能,则该分区表后还会保存签名信息。这个默认偏移地址在make menuconfig - Partition Table-offset of Partition Table这里设置。修改这个值,会影响到后面所有分区的偏移量。
  3. NVS分区:这个实际上是NVS(2)分区。用于存储每台设备的 PHY 校准数据(注意,并不是 PHY 初始化数据)。也用于存储 Wi-Fi 数据(如果使用了 esp_wifi_set_storage(WIFI_STORAGE_FLASH) 初始化函数)和通过NVS API 保存的其他应用程序数据。强烈建议为 NVS 分区分配至少 0x3000 字节空间。上图分配了0x4000字节。
  4. OTA data分区:系统从哪个app分区启动由此分区内的信息决定。
  5. Phy_init分区:用于存储 PHY 初始化数据。这样可以为每个设备(而不是在固件中)配置 PHY。在默认的配置中,phy partition 未被使用。
  6. Factory app分区:用于保存工厂(出厂)应用程序。如果分区表中有工厂应用程序,ESP-IDF 软件启动加载器会启动工厂应用程序。如果分区表中没有工厂应用程序(如上面的分区表例子),则启动第一个可用的 OTA 分区(通常是 OTA_0)。
  7. Core dump分区:core dump分区用于查找系统崩溃时的软件错误,系统崩溃的时候会将调试信息写入到Flash中保存以便开发者对崩溃原因进行分析。关于这个分区的使用可以参考使用ESP32 的调试工具 coredump。
  8. OTA_0/OTA_1分区用于保存OTA下载的固件。OTA启用后,OTA下载的固件镜像交替保存于OTA_0/OTA_1分区,镜像验证后,OTA data分区更新,指定在下一次启动时使用该镜像。OTA不会影响到Factory app分区,这样用户可以随时恢复到出厂状态。
  9. fctry分区:保存阿里云四元组。如果不连接阿里云,该分区可以省略。

esp-aliyun仓库提供的默认例程的分区表文件(examples/ota/ota_example_mqtt/partitions_esp32.csv)如下:

# Name,   Type, SubType, Offset,   Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs,      data, nvs,     ,        0x4000,
otadata,  data, ota,     ,        0x2000,
phy_init, data, phy,     ,        0x1000,
ota_0,    app,  ota_0,   ,        1M,
ota_1,    app,  ota_1,   ,        1M,
fctry,    data, nvs,     ,        0x4000

关于这个分区表文件的说明:

  1. 在上面分区表文件内,没有写偏移地址(offset),只标明长度,所以相应分区会紧跟着前一个分区之后开始;若为首个分区,则将紧跟着分区表(Partition Table)开始。系统会自动计算。
  2. 即便系统自动计算了偏移地址,fctry的offset仍然需要我们自行计算,因为我们需要手动烧录这个分区,而烧录的时候需要指定地址。
  3. app 分区的偏移地址必须要与 0x10000 (64K)对齐,如果将偏移字段留空,gen_esp32part.py 工具会自动计算得到一个满足对齐要求的偏移地址。如果 app 分区的偏移地址没有与 0x10000 (64K) 对齐,则该工具会报错。
  4. 上面的这个分区表例子中没有Factory app工厂应用程序分区,所以默认从第一个可用的 OTA 分区(通常是 OTA_0)启动。

下面是esp-idf/components/partition_table/partitions_two_ota_coredump.csv中的分区标文件内容,可以看到比上个例子多了factory分区。

# Name,   Type, SubType, Offset,   Size
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs,      data, nvs,     ,         0x4000
otadata,  data, ota,     ,         0x2000
phy_init, data, phy,     ,         0x1000
factory,  0,    0,       ,         1M
coredump, data, coredump,,         64K
ota_0,    0,    ota_0,   ,         1M
ota_1,    0,    ota_1,   ,         1M

关于ESP8266分区表,可以参考ESP8266 分区表介绍

参考文献::

  1. 分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档
  2. 空中升级 (OTA) - ESP32 - — ESP-IDF 编程指南 latest 文档
  3. ESP8266 分区表介绍

ESP32分区表图解相关推荐

  1. ESP32 快速入门(九):自定义 ESP32 分区表 partitions.csv

    最近在 ESP32 编译中遇到了以下问题: esp_image: Image length 1057652 doesn't fit in partition length 1048576 boot: ...

  2. 自定义 ESP32 分区表 partitions.csv

    最近在 ESP32 编译中遇到了以下问题: esp_image: Image length 1057652 doesn't fit in partition length 1048576 boot: ...

  3. ESP32分区表,flash大小修改

    分区表: 用Excel表格打开分区表文件partitions_singleapp.csv 例如我的路径E:\Espressif\frameworks\esp-idf-v4.3.2\components ...

  4. 用Diskedit修复分区表(图解教程)

    我们经常在使用电脑的时候,由于非法操作和病毒的侵袭会导致系统不能引启,驱动器丢失,其实就是有可能就是分区表损坏,遇到这种情况,很多朋友都选择重新分区格式化磁盘加以修复,其实这种"修复&quo ...

  5. 图文手把手教程--ESP32 MQTT连接阿里云生活物联网平台

    本文内容 1)在阿里云生活物联网平台,创建自有品牌项目,并在项目下创建产品"智能灯001". 2)下载阿里云SDK-esp-aliyun,使用例程smart_light,通过&qu ...

  6. 图文手把手教程--ESP32 MQTT连接腾讯云物联网平台及OTA固件升级

    本文内容 1)在腾讯云物联网开发平台,新建项目,并在项目下新建设备"light_001". 2)下载腾讯云SDK-esp-qcloud,使用例程led_light,通过" ...

  7. 图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)

    本文内容 1)使用hello_world例程,编译生成hello_world.bin文件,并且开启HTTP本地服务器. 2)使用simple_ota_example例程,通过HTTP服务器访问hell ...

  8. ESP32自定义分区表

    ESP32自定义分区表 编译ESP32工程生成bin文件大小超过1M时,会报"app partition is too small for binary"的错误.原因是分区表中fa ...

  9. 【ESP32】分区表

    ESP32 - 分区表及其配置 一.环境 二.记录 1.VScode进入设置界面 2.CMD进入配置界面 3.分区表参数 1)无OTA分区(官方) 1)有OTA分区(官方) 4.分区表介绍 最后 推荐 ...

  10. Arduino ESP32将数据保存到NVS中

    Arduino ESP32将数据保存到NVS中 该功能类似AVR单片机里面的EEPROM存储区域. 关于ESP32分区表参考<分区表> Preferences中数据以键值对(key - v ...

最新文章

  1. 通过COLA看应用架构
  2. Android Bluetooth 文件接收路径修改方法
  3. 什么?注释里面的代码居然能够执行
  4. 14-angular.isDefined
  5. ulead gif animator_搞笑GIF趣图:这风看来很大啊,今天回不来家了7
  6. 2-4:套接字(Socket)编程之TCP通信
  7. mysql 开源订阅模式_Canal(增量数据订阅与消费 )快速配置
  8. Git学习总结(18)——让你成为Git和GitHub大神的20个技巧
  9. 经典排序算法总结与Python实现(上)
  10. 楷书和草书哪幅更具有艺术性?
  11. 谷歌返华或联手腾讯;华为否认5G专利收费;滴滴外挂让车费翻倍 | 极客头条...
  12. log4net用法实例
  13. BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)
  14. [收藏] 将 DTS 用于业务智能解决方案的最佳实践
  15. 用PHP写APP后台
  16. 解决问题-ERROR 1044 (42000) Access denied for user ''@'localhost' to database 'mysql
  17. 笔记本无法打开摄像头
  18. iOS-苹果应用商店审核指南中文翻译
  19. Null和Underfined
  20. Pytesseract图片识别结果箭头符号去除

热门文章

  1. 一起学英语 - 前言
  2. (附源码)app学科竞赛活动报名系统 毕业设计 012239
  3. stored property text without initial value prevents synthesized initializers
  4. Coursera课程自然语言处理(NLP) 借助概率模型做自然语言处理 deeplearning.ai
  5. [HITML]哈工大2020秋机器学习复习笔记
  6. 微信内嵌浏览器打开手机浏览器下载APP(APK)的方法
  7. The YARN Timeline Server
  8. 星际争霸2 AI开发
  9. PowerVR 三十周年:回顾与展望
  10. mysql改为sql_sql - 将MySQL列更改为AUTO_INCREMENT