[关于 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 运行模式以及频率进行配置,然后根据分区表的定义,从对应的地址加载应用程序,并且运行应用程序固件。