boot_app0.bin和bootloader_dio_80m.bin文件的用途是什么?(ESP32-Arduino IDE)

boot_app0.bin和bootloader_dio_80m.bin文件的用途是什么?(ESP32-Arduino IDE),arduino,microcontroller,esp32,firmware,arduino-esp32,Arduino,Microcontroller,Esp32,Firmware,Arduino Esp32,由Arduino IDE执行的ESP32闪存命令似乎在闪存两个引导加载程序文件:boot\u app0.bin偏移量0xe000和bootloader\u dio\u 80m.bin偏移量0x1000。我想知道这两个引导程序文件实际上是做什么的,为什么有两个。下面我将提供更多信息 1.上下文 我是为微控制器开发新的免费IDE的团队的一员:Embeetle IDE。我们计划在不久的将来支持ESP32微控制器系列。因此,我现在正在研究ESP32构建系统-ESP-IDF工具和ESP32项目的Ardui

由Arduino IDE执行的ESP32闪存命令似乎在闪存两个引导加载程序文件:
boot\u app0.bin
偏移量0xe000和
bootloader\u dio\u 80m.bin
偏移量0x1000。我想知道这两个引导程序文件实际上是做什么的,为什么有两个。下面我将提供更多信息

1.上下文 我是为微控制器开发新的免费IDE的团队的一员:Embeetle IDE。我们计划在不久的将来支持ESP32微控制器系列。因此,我现在正在研究ESP32构建系统-ESP-IDF工具和ESP32项目的Arduino IDE方法

2.ESP32项目的Arduino IDE闪存程序 构建
.elf
文件后,Arduino IDE启动一个命令将其转换为二进制文件:

python esptool.py——芯片esp32 elf2image
--闪光模式dio
--闪光频率80m
--闪光灯尺寸4MB
-o/tmp/arduino_build_852524/WiFiScan.ino.bin
/tmp/arduino_build_852524/WiFiScan.ino.elf
最后,这个
WiFiScan.ino.bin
文件与两个引导加载程序文件和分区表一起被闪存到电路板上:

python esptool.py——芯片esp32
--端口/dev/ttyUSB0
--波特率921600
--在默认值重置之前
--硬复位后写入闪存
-z
--闪光模式dio
--闪光频率80m
--闪光大小检测
0xe000~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin
0x1000~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader\u dio\u 80m.bin
0x10000/tmp/arduino\u build\u 852524/WiFiScan.ino.bin
0x8000/tmp/arduino\u build\u 852524/WiFiScan.ino.partitions.bin
Arduino IDE使用的默认分区表如下所示(csv格式):

此csv文件的二进制等效文件被闪存到地址
0x8000
。还有两个引导加载程序文件分别被闪存到地址
0xe000
0x1000
(见下一段)

3.引导加载程序文件 正在闪存的两个引导加载程序文件是:

# flashed at 0xe000
~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin
以及:

问题1:这两个引导加载程序文件的作用是什么

观察它们的位置也很有趣。第一个
boot\u app0.bin
位于名为
'partitions'
的文件夹中。它位于几个分区
.csv
文件旁边。为什么?但当问题1得到回答时,这一点可能就清楚了

另一个文件,
bootloader\u dio\u 80m.bin
位于名为
'sdk/bin/'
的文件夹中,与其他文件并排放置,这些文件的名称都以
'bootloader\u80m.bin
前缀开头:

问题2:至于在地址
0x1000
处闪烁的引导加载程序文件,我认为
“u40m”和
“u80m”后缀代表以MHz为单位的闪烁速度。但是我不知道
“u dio”
“dout”
“u qout”
后缀代表什么

请开导我^_^


答复 多亏了@Juraj,我现在对ESP32芯片的启动过程有了更好的了解。我相信是这样的:

  • 第一阶段引导加载程序
    硬连线的ROM引导加载程序首先运行。此第一阶段引导加载程序位于闪存之外,无法编程。它加载第二阶段引导加载程序(参见下一步)

  • 第二阶段引导加载程序
    第一阶段ROM引导加载程序在闪存中的地址
    0x1000
    处加载第二阶段ESP-IDF软件引导加载程序。这里的代码是
    bootloader_dio_80m.bin
    可执行文件,可在ESP-IDF框架的
    components/bootloader
    目录中找到。 此第二阶段引导加载程序读取默认情况下在偏移量
    0x8000
    处找到的分区表。如果在分区表中找到OTA应用程序分区,则引导加载程序将参考
    OTA\u数据
    分区,以确定应引导哪个分区

  • 启动开关
    可将
    ota_数据
    部分仅视为一个开关,位于闪存中的
    0xe000
    。它决定是启动
    app0
    还是启动
    app1
    。开关本身是
    boot_app0.bin
    二进制文件。正如Juraj所说,2kB大小也用于在OTA闪烁时记笔记

  • 应用程序
    app0
    app1
    执行应用程序

  • 还感谢您向我指出这些资源:


    0x1000处的二进制文件是引导加载程序。Arduino ESP32具有与Arduino IDE(从boards.txt构建)中工具菜单中的boards选项相对应的引导加载程序二进制文件

    引导加载程序函数已记录在案

    ESP-IDF软件引导加载程序执行以下功能:

    • 内部模块的最小初始配置
    • 初始化闪存加密和/或安全功能(如果配置)
    • 根据分区表和ota_数据(如果有),选择要引导的应用程序分区
    • 将此映像加载到RAM(IRAM和DRAM)并向其传输管理
    boot_app0.bin是OTA数据分区的初始内容。这是有案可查的

    OTA数据分区的大小为两个闪存扇区(0x2000字节),以防止写入时出现电源故障。扇区被独立地擦除并使用匹配的数据写入,如果它们不一致,则使用计数器字段确定最近写入的扇区

    迪奥,秋,杜,秋
    # flashed at 0xe000
    ~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin
    
    # flashed at 0x1000
    ~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader_dio_80m.bin