Flash是嵌入式环境中的“固态硬盘”。在ESP32中,Flash被用来保存代码和数据,下面对ESP32的Falsh进行解读。
1. ESP32烧写程序时写入的文件
1.1 bootloader.bin
作用
- 系统启动时第一个执行的程序
- 初始化硬件(时钟、Flash、RAM等)
- 验证应用程序的完整性
- 加载并跳转到应用程序
Flash 地址
- 默认地址:
0x1000
- 大小:通常为 28KB
- 分区表中对应:
bootloader
分区
1.2 分区表 (partition_table.bin)
作用
- 定义 Flash 存储空间的布局
- 指定各个分区的位置和大小
- 包含分区类型和属性信息
Flash 地址
- 默认地址:
0x8000
- 大小:通常为 3KB
- 分区表中对应:
partition
分区
1.3 app.bin
作用
- 用户应用程序
- 包含主程序代码
- 包含用户数据
Flash 地址
- 默认地址:
0x10000
- 大小:根据分区表定义,通常为 1MB 或更大
- 分区表中对应:
app
分区
1.4 Flash 布局示例
0x0000 +------------------+| || || |
0x1000 +------------------+ <- bootloader.bin| || || |
0x8000 +------------------+ <- partition_table.bin| || |
0x10000 +------------------+ <- app.bin| || || |+------------------+
1.5 分区表示例
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
1.6 Flash烧写方法
Flash和CPU是通过SPI通信的。
可以使用以下方式烧写Flash:
- esptool.py:官方烧写工具
- Flash 下载工具:官方图形界面工具,flash download tool
- 自定义烧写程序:通过 SPI 接口直接操作
使用VSCode可以修改烧写参数:
2. ESP32启动流程
- 系统上电后,ROM 中的引导程序首先执行,和BIOS程序类似。ROM和Flash的区别是,ROM中的程序是出厂就固定的,像BIOS一样,而Flash是可以反复读写的。
- 引导程序从
0x1000
加载 bootloader,类似于UBoot - bootloader 从
0x8000
读取分区表 - 根据分区表找到 app 分区
- 验证并加载应用程序
- 跳转到应用程序执行
可以看出,计算机启动的方式很类似,不管是嵌入式计算机还是PC机,启动过程都被分为了若干步骤,每个步骤专注做一件事,承上启下,互相协作,最终目标是让计算机把各种软件程序正确运行起来,给用户使用。
3. 其他
注意事项
- 地址和大小可以通过分区表自定义
- 不同型号的 ESP32 可能有不同的默认配置
- 分区表可以根据应用需求修改
- 建议保留 bootloader 和分区表的默认地址
- 应用程序地址可以根据需要调整
设计优势
- 模块化:各个组件职责明确
- 灵活性:可以自定义分区布局
- 安全性:支持应用程序验证
- 可维护性:便于更新和调试
- 可扩展性:支持多种分区类型