ESP32 启动流程

官网链接:https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/general-notes.html
 

 

应用程序的启动流程

本文将会介绍 ESP32 从上电到运行 app_main 函数中间所经历的步骤(即启动流程)。

宏观上,该启动流程可以分为如下 3 个步骤:

  1. 一级引导程序被固化在了 ESP32 内部的 ROM 中,它会从 Flash 的 0x1000 偏移地址处加载二级引导程序至 RAM(IRAM & DRAM) 中。
  2. 二级引导程序从 Flash 中加载分区表和主程序镜像至内存中,主程序中包含了 RAM 段和通过 Flash 高速缓存映射的只读段。
  3. 主程序运行,这时第二个 CPU 和 RTOS 的调度器可以开始运行。

下面会对上述过程进行更为详细的阐述。

一级引导程序

SoC 复位后,PRO CPU 会立即开始运行,执行复位向量代码,而 APP CPU 仍然保持复位状态。在启动过程中,PRO CPU 会执行所有的初始化操作。APP CPU 的复位状态会在应用程序启动代码的 call_start_cpu0 函数中失效。复位向量代码位于 ESP32 芯片掩膜 ROM 的 0x40000400 地址处,该地址不能被修改。

复位向量调用的启动代码会根据 GPIO_STRAP_REG 寄存器的值来确定 ESP32 的工作模式,该寄存器保存着复位后 bootstrap 引脚的电平状态。根据不同的复位原因,程序会执行不同的操作:

  1. 从深度睡眠模式复位:如果 RTC_CNTL_STORE6_REG 寄存器的值非零,并且 RTC_CNTL_STORE7_REG 寄存器中的 RTC 内存的 CRC 校验值有效,那么程序会使用 RTC_CNTL_STORE6_REG 寄存器的值作为入口地址,并立即跳转到该地址运行。如果 RTC_CNTL_STORE6_REG 的值为零,或者 RTC_CNTL_STORE7_REG 中的 CRC 校验值无效,又或者跳转到 RTC_CNTL_STORE6_REG 地址处运行的程序返回,那么将会执行上电复位的相关操作。 注意 :如果想在这里运行自定义的代码,可以参考 :doc:`深度睡眠 <deep-sleep-stub>` 文档里面介绍的方法。
  2. 上电复位、软件 SoC 复位、看门狗 SoC 复位:检查 GPIO_STRAP_REG 寄存器,判断是否 UART 或 SDIO 请求进入下载模式。如果是,则配置好 UART 或者 SDIO,然后等待下载代码。否则程序将会执行软件 CPU 复位的相关操作。
  3. 软件 CPU 复位、看门狗 CPU
### ESP32 启动流程概述 ESP32启动过程是一个复杂而有序的过程,涉及多个阶段和组件。以下是关于其启动流程固件烧录以及引导程序的相关说明。 #### 1. **启动流程** 当电源接通时,ESP32 进入复位状态并执行一系列初始化操作。具体来说: - **ROM Bootloader**: 当芯片上电或复位后,内置 ROM bootloader 被加载运行。该部分代码负责读取 Flash 中的分区表和应用程序映像文件,并决定如何继续启动[^1]。 - **Partition Table**: 存储在 Flash 上的一个特定区域,定义了存储空间的不同用途(如应用固件、OTA 数据等)。它决定了哪个分区中的镜像是有效的主程序[^2]。 - **Application Firmware Load**: 如果一切正常,则会跳转至用户自定义的应用程序入口地址处开始正式工作模式下的任务调度与处理逻辑[^3]。 如果在此期间遇到任何错误或者异常情况(比如校验失败),则可能进入安全模式等待进一步指示。 #### 2. **固件烧录** 对于初次使用的开发者而言,正确地完成固件烧录是非常重要的一步。这通常包括以下几个方面的工作内容: - **选择合适的二进制文件**:根据所选型号下载对应版本的标准出厂参数配置文件`factory_param_XXX.bin`, 并将其写入指定偏移位置以便后续识别硬件特性差异. - **使用专用工具上传软件包**:`esptool.py` 是官方推荐用于管理整个刷机过程的主要手段之一, 它可以轻松实现擦除flash全部数据区段等功能的同时还能精确控制目标地址范围内的写入动作[^4]. ```bash esptool.py --chip esp32 write_flash -z 0x1000 path/to/firmware.bin ``` 上述命令展示了基本形式下向设备内部闪存单元零号起始点拷贝已编译好的可执行体实例的方法. #### 3. **引导程序与配置参数** 除了标准的操作系统之外,还需要关注一些额外的关键要素来保障系统的稳定性和功能性扩展可能性: - **Boot Mode Selection Pins Configuration**: 在某些情况下可以通过外部电路设计固定几个GPIO的状态从而强制改变默认行为路径; 对于生产环境中批量部署的产品线尤其有用因为能够简化测试验证环节的时间成本投入效率提升明显. - **Custom Parameter Storage Management**: 利用 NVS(non-volatile storage) API 可以为每个单独个体保存个性化设定值而不影响其他无关属性字段的内容持久化保留机制非常灵活方便实用性强. 通过以上介绍可以看出从最底层物理层面直到高层抽象概念之间存在着紧密联系相互作用共同构成了完整的嵌入式解决方案生态系统架构图景.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值