https://www.esp32.com/viewtopic.php?f=25&t=8030
[关于 ROM]
在esp32 上电运行后,芯片运行的第一个程序。这段程序是芯片设计与生产的时候,固化在硬件电路中的。所以它是不可修改的(Read Only Memory)。
esp32 的 ROM 负责检测芯片的strapping配置,来决定芯片应该处于什么状态。比如,esp32 上电后,ROM 程序会检查 [GPIO0, GPIO2, GPIO4, MTDO, GPIO5]的状态。
如果 GPIO0 / GPIO2 同时为低电平,则会进入下载模式,等待串口通信信息。
如果GPIO0为高电平,则会进入Flash 运行模式,启动SPI 驱动,并加载Flash中的程序段。
BOOT_MODE[5:0]:
(pull-up, pull-down, pull-down, pull-up, pull-up, SW4 /5/4/3/2/1/ )
[GPIO0, GPIO2, GPIO4, MTDO, GPIO5]
1 x x x x --> SPI Boot
0 0 x x x --> Download Boot (Jonit-Detection of UART0+UART1+SDIO_Slave)
下载模式的串口输出如下(115200), ROM默认会输出当前所处的模式。
rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download
其中,boot:0x3 表示的是芯片strapping pin脚的状态,
0x03对应 [GPIO0, GPIO2, GPIO4, MTDO, GPIO5] 的值为 [ 0, 0, 0, 1, 1]
所以处于 Download Boot 模式。
[关于下载模式]
当esp32处于下载模式时,会等待串口通信同步,并按照通信协议等待接收指令(协议可参考该文档:https://github.com/espressif/esptool/wi … l-Protocol)
通过esptool脚本,可以进行寄存器的读写,固件下载,程序运行等操作。
[关于STUB]
在ROM模式,由于芯片处于低频工作的状态,通信速率受限。
在esptool中,会将一段小程序加载到esp32的RAM中,并跳转执行RAM中的小程序。这段小程序包含了ROM中相同的串口通信协议,并对其进行了扩充。感兴趣的开发者,(可以参考这里https://github.com/espressif/esptool/tr … asher_stub)
[关于 Flash Boot 模式]
如果芯片启动时,GPIO0为高电平,芯片会进入Flash 运行模式。 此时,启动SPI 驱动,并加载Flash中的程序段。ROM 会读取外置 Flash 的0x1000地址,加载并运行二级bootloader。
[关于 Bootloader]
bootloader可以认为是一个独立的小程序,bootloader会对芯片频率进行初始化,并且读取系统SPI的配置信息,对Flash 运行模式以及频率进行配置,然后根据分区表的定义,从对应的地址加载应用程序,并且运行应用程序固件。
[13:57:26.513]收←◆07) esp_image: segment 0: paddr=0x00110020 vaddr=0x3f400020 size=0x1f700 (128768) map[0m
[0;32mI (161) esp_image: segment 1: paddr=0x0012f728 vaddr=0x3ffb0000 size=0x008e8 ( 2280) load[0m
[0;32mI (162) esp_image: segment 2: paddr=0x00130018 vaddr=0x400d0018 size=0x6b238 (438840) map[0m
[0;32mI (321) esp_image: segment 3: paddr=0x0019b258 vaddr=0x3ffb08e8 size=0x01dd8 ( 7640) load[0m
[0;32mI (324) esp_image: segment 4: paddr=0x0019d038 vaddr=0x40080000 size=0x00400 ( 1024) load[0m
[0;32mI (328) esp_image: segment 5: paddr=0x0019d440 vaddr=0x40080400 size=0x0f4d4 ( 62676) load[0m
[0;32mI (363) esp_image: segment 6: paddr=0x001ac91c vaddr=0x400c0000 size=0x00000 ( 0) load[0m
[0;32mI (363) esp_image: segment 7: paddr=0x001ac924 vaddr=0x50000000 size=0x00010 ( 16) load[0m
[0;32mI (378) boot: Loaded app from partition at offset 0x110000[0m
[0;32mI (379) boot: Disabling RNG early entropy source…[0m