1. 前言

ESP32开发过程中,对于我们实际的开发人员来说,将程序烧录进入ESP32内不是什么复杂的事情,直接输入idf.py flash 指令即可实现,但是当我们开发完成之后,如何将对应的bin文件提供给测试人员进行相应的测试,以及如何提供bin文件给到产线进行生产呢?

通常将工程文件直接发送出去是不现实的做法,因此需要我们对应的开发人员输出相应的bin文件,提供给测试及生产,那么ESP32 IDF如何实现bin文件的生成?以及如何将生成的多个bin文件进行合并生成一个bin文件呢?

本文将详细介绍,在我们使用 ESP-IDF 开发完对应工程软件之后的一系列生成、打包操作,包括 bin文件的生成 以及相应的 bin文件合并 等操作。

2. 硬件及分区表

控制器:ESP32-WROOM-32UE
开发方案:ESP-IDF

工程分区表如下:

Tips: 如需更加深入了解ESP32分区表有关内容,可参考博主另外一篇博客 ESP32 分区表(点击跳转!) 或官方 IDF 编程指南。

3. 编译

采用IDF工具实现ESP32的编译,具体命令如下:

idf.py build

编译成功之后,可以在控制终端打印的信息提示生成了对应的文件,同时在最后提示,“To flash, run this command”,对应含义为“如果需要烧录需要运行下述命令”

通过提示可知,我们可以知道需要烧录哪些文件,如此处需要烧录的文件是:

  • bootloader.bin 地址:0x1000
  • partition-table.bin 地址:0x8000
  • ota_data_initial.bin 地址:0xd000
  • test.bin 地址:0x10000

4. 烧录

关于esp32的固件烧录主要有两种方式:

  • 在工程目录下直接使用idf flash命令烧录
  • 使用官方烧录工具 Flash Download Tools

4.1 使用 idf flash 命令烧录

使用 idf flash 指令烧录的方式,需要在对应的工程目录下进行烧录,idf工具会自动执行工程编译、之后读取工程 build/ 目录下的bin文件并进行烧录,此方式适用于对应的开发人员在软件开发、调试阶段进行烧录及调试使用。

4.2 使用 Flash Download Tools 工具烧录

Flash Download Tools工具下载地址:https://www.espressif.com/en/support/download/other-tools

此方式烧录拿到对应工程编译生成的bin文件,由于此烧录方式不需要提供源码,因此此方式一般常用于工厂生产或测试过程中使用。

关于 Flash Download Tools的使用说明,在下载的工具包内有相关文档说明,大家可自行查阅,下述只对部分关键点进行简述


4.3 Flash Download Tools Q&A

4.3.1 工程所需的烧录bin文件有哪些?

  • 在调用idf.py build命令编译完以后会生成对应的提示信息,提示信息内包含烧录完整工程所需的bin文件项

  • 注意每个工程生成的bin文件项不一样,根据每个工程内容不同,编译生成的bin文件数量也会不一样
  • 提示信息中不仅提示了对应bin文件的所处的文件路径,同时在每个文件路径前提示了对应bin文件应烧录的地址

4.3.2 生成的bin文件数量太多,能否合成一个?

在实际开发中,我们会发现一个工程编译下来,会生成好几个bin文件,少则三四个,多则上十个,这么多的bin文件,如果使用 Flash Download Tools 进行烧录的话,每个bin文件都需要点 ... 进行路径选择,并填写对应的烧录地址,这是一个很麻烦的事情,更是一个极容易出错的问题,那能否将这些bin文件合成成为一个bin文件呢?

当然是可以的,接下来我们将分享三种 esp32 bin文件合并的方案,大家可根据自行需要进行选择哪一种方案更加适合自己!


4.3.2.1 使用 FLash Download Tools 合并bin文件

如图所示,Example:


4.3.2.2 使用 esptool.py 工具的 merge_bin 功能进行合并

merge_bin 命令将会合并多个bin文件为一个bin文件,多个bin文件中间间隔的部分将会使用0xFF进行填充

esptool.py --chip ESP32 merge_bin -o merged-flash.bin --flash_mode dio --flash_size 4MB 0x1000 bootloader.bin 0x8000 partition-table.bin 0x10000 app.bin

以上命令将 bootloader.bin(0x1000地址开始烧写) partition-table.bin(0x8000地址开始烧写) app.bin(0x10000地址开始烧写)合并为一个bin文件,并命名为merged-flash.bin(起始地址为0x0)

  • 如需指定flash大小可使用 --flash_size参数
  • 如需指定flash最大通讯频率可使用--flash_freq参数
  • 如需指定flash通讯模式可使用--flash_mode参数
  • 如需指定合并后的bin文件起始地址偏移可使用--target-offset 0xNMN
  • 如需指定合并后的bin文件包总大小可使用--fill-flash-size SIZE,SIZE设置具体的大小


4.3.2.3 使用文本文件描述merge_bin选项进行合并

  4.3.2.2 中需要在 merge_bin命令中输入所有待合并的bin文件路径以及对应的偏移地址,当bin文件较多的时候输入较多的参数也是一个较为复杂且易出错的问题,那是否可以考虑将此指令编写成一个脚本呢?当我在准备为其编写一个脚本的时候,发现 esp32 其实也考虑了这个点

  其实在编译的时候,工程同时也生成了一个文本文件来描述需要生成的bin文件,在对应工程目录下执行了 idf.py build 命令之后,我们可以发现在 build/ 目录下会生成一个 flash_args 文件,打开此文件如下:

  此文件内描述了调用esptool.py merge命令的参数信息,因此我们可以直接使用此文件合并一个完整的工程bin文件,且此文件内的信息都是编译自动生成的,也就解决了我们手动一个个输入bin文件造成的误输入导致的错误问题!

具体操作方法如下:

  • 编译工程 idf.py build
  • 进入编译生成的build目录 cd ./build
  • 执行merge_bin命令,调用flash_args文本内的参数 esptool.py --chip ESP32 merge_bin -o merged-flash.bin @flash_args

  • Tips 如果执行命令报错,请检查 ①flash_args是否在build目录下存在 ②确认执行此命令时已进入build目录下!!

创作不易,转载请注明出处!

关注、点赞+收藏,可快速查收博主有关分享!