如何给 ESP32 选择外接 Flash 以及如何使能 QIO 模式

本文详细介绍了在ESP32开发中如何正确选择外接Flash,包括考虑工作电压、容量、工作模式及环境温度等关键因素。同时,深入解析了如何在ESP32上启用QIO高速模式,包括修改IDF源码的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【前言】
许多用户在使用 ESP32 做开发的时候,都会碰到如何选择外接 Flash 的难题,因为不同厂商的 Flash 存在很多差异,Flash 支持的工作模式也不同。

【如何给 ESP32 选择外接 Flash】
用户在选择 Flash 时,需要注意以下几个方面:
* 工作电压
* 容量
* 工作模式
* 工作环境温度

1. 工作电压
这是一个用户在选择 Flash 时很容易忽视但又非常重要的参数,下面列出几个常用的 ESP32 模组的 Flash 工作电压。
* ESP32-WROOM-32: 3.3V
* ESP32-WROOM-32D: 3.3V
* ESP32-WROVER: 1.8V
* ESP32-WROVER-B: 3.3V

2. 容量
ESP32 支持的 Flash 最大容量为 128 Mbit(16 Mbyte),推荐用户选择的容量范围为 16~128 Mbit。

3. 工作模式
Flash 常用的工作模式有 4 种:DOUT/DIO/QOUT/QIO
* DOUT:地址为 1 线模式输入,数据为 2 线模式输出
* DIO:地址为 2 线模式输入,数据为 2 线模式输出
* QOUT:地址为 1 线模式输入,数据为 4 线模式输出
* QIO:地址为 4 线模式输入,数据为 4 线模式输出
用户如果需要使用 QIO 模式,则需要在选择 Flash 时确认该 Flash 是否支持 QIO 模式。

4. 工作环境温度
不同用户开发的产品使用的环境温度也不同,可根据实际的工作环境进行选择。

【如何使能 QIO 模式】
有些用户选择了一颗支持 QIO 模式的 Flash,发现配置成 QIO 模式之后却跑不起来,或者 还是 DIO 模式在跑,这是由于没有成功使能 QIO 造成的。这时如果想要支持该 Flash 的 QIO 模式,则需要对 IDF 进行一点修改。具体步骤如下:

1. 首先配置成 DIO 模式运行,确保代码和硬件没有问题。
> 注意:有时 Flash 的 SD2/SD3(WP/HOLD) 脚虚焊或者短路也会造成 QIO 跑不起来,可以检查一下

2. 查看 IDF 中 `flash_qio_mode.c` 中的代码,通常在修改时只要在 `chip_data` 这个数组中添加一项参数配置,这个数组如下:

Code: Select all

const static qio_info_t chip_data[] = {
/*   Manufacturer,   mfg_id, flash_id, id mask, Read Status,                Write Status,               QIE Bit */
    { "MXIC",        0xC2,   0x2000, 0xFF00,    read_status_8b_rdsr,        write_status_8b_wrsr,       6 },
    { "ISSI",        0x9D,   0x4000, 0xCF00,    read_status_8b_rdsr,        write_status_8b_wrsr,       6 }, /* IDs 0x40xx, 0x70xx */
    { "WinBond",     0xEF,   0x4000, 0xFF00,    read_status_16b_rdsr_rdsr2, write_status_16b_wrsr,      9 },
    { "GD",          0xC8,   0x6000, 0xFF00,    read_status_16b_rdsr_rdsr2, write_status_16b_wrsr,      9 },
    { "XM25QU64A",   0x20,   0x3817, 0xFFFF,    read_status_8b_xmc25qu64a,  write_status_8b_xmc25qu64a, 6 },

    /* Final entry is default entry, if no other IDs have matched.

       This approach works for chips including:
       GigaDevice (mfg ID 0xC8, flash IDs including 4016),
       FM25Q32 (QOUT mode only, mfg ID 0xA1, flash IDs including 4016)
    */
    { NULL,          0xFF,    0xFFFF, 0xFFFF,   read_status_8b_rdsr2,       write_status_8b_wrsr2,      1 },
};

这个数组用于配置 QIO 使能,每一项参数对应的意义注释中都已标明,下面进行详细解释:
Manufacturer:这个用于标识 Flash 的制造厂商,也可以设置成型号,便于区分即可
mfg_id: 制造商 ID
flash_id: Flash ID,通常用制造商 ID + Flash ID 作为一款 Flash 的唯一标识。
id_mask: 由于一个厂商生产的多款 Flash 使能 QIO 的方式是一样的(比如某一个系列的产品只是容量不同,其他都是一致的),这时就可以通过 id_mask 来限定只要 ID 的部分 bit 相同即可使用相同的使能方式,通常 Flash ID 的后面 1 个字节用来区分容量,所以可以将 id_mask 设置为 0xFF00,即表示前 1 个字节相同即可。如果指定某一个特定型号的 Flash,则需要填写完整的 flash_id,并将 id_mask 设置为 0xFFFF。
Read Status:读状态寄存器回调函数,在选择回调函数时需要了解使用的 Flash 的寄存器读取方式,包括读取的命令和一次读取几个字节
Write Status:写状态寄存器回调函数,同样需要了解使用的 Flash 的寄存器写入方式,包括写入的命令和一次写入几个字节
QIE Bit:QIO 使能比特,QIO 使能即把状态寄存器中的 QE 比特写成 1。

3. 上面描述的这些参数在 Flash 的 datasheet 中都可以找到,下面就以 GD25LQ32C 为例子来讲解如果查找到对应的参数并选择相应的读写寄存器回调函数。
(1)找到 Flash ID,如下图所示:

gd25lq32c_id.png

gd25lq32c_id.png (23.18 KiB) Viewed 1728 times

我们使用 9FH 读取 Flash ID,所以从 9FH 一栏即可找到对应的 mfg_id 和 flash_id。GD25LQ32C 的 mfg_id 为 0xC8,flash_id 为 0x6016

(2)找到 QE bit 以及 QE bit 所在的寄存器,如下图所示:

gd25lq32c_qe.png

gd25lq32c_qe.png (24.93 KiB) Viewed 1728 times

可以看到 GD25LQ32C 的状态寄存器有 2 个字节,QE bit 为第 9 bit。

(3)根据状态寄存器的读写方式选择回调函数。从 Flash 操作的命令列表找到寄存器相关操作的部分,如下图所示:

gd25lq32_sr_wr.png

gd25lq32_sr_wr.png (198.68 KiB) Viewed 1728 times

可以看到 GD25LQ32C 的状态寄存器的需要使用 2 个命令来读取,每个命令读取 1 个字节,所以给该 Flash 选择的读取状态寄存器的回调函数为 `read_status_16b_rdsr_rdsr2`。写状态寄存器时使用 1 个命令写入 2 个字节的方式,所以给该 Flash 选择的写入状态寄存器的回调函数为 `write_status_16b_wrsr`

4. 添加 QIO 使能配置完成之后重新编译,下载,运行;能够正常运行且看到如下打印即说明 QIO 已使能成功。

Code: Select all

I (9) boot: ESP-IDF v3.2-dev-1287-g1c530c3-dirty 2nd stage bootloader
I (9) boot: compile time 17:01:34
I (10) boot: Enabling RNG early entropy source...
I (25) qio_mode: Enabling QIO for flash chip GD
I (31) boot: SPI Speed      : 80MHz
I (35) boot: SPI Mode       : QIO
I (39) boot: SPI Flash Size : 4MB
I (43) boot: Partition Table:
I (47) boot: ## Label            Usage          Type ST Offset   Length
I (54) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (62) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (69) boot:  2 factory          factory app      00 00 00010000 00100000
I (77) boot: End of partition table
I (81) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x08ffc ( 36860) map
I (99) esp_image: segment 1: paddr=0x00019024 vaddr=0x3ff80000 size=0x00000 (     0) load
I (100) esp_image: segment 2: paddr=0x0001902c vaddr=0x3ff80000 size=0x00000 (     0) load
I (107) esp_image: segment 3: paddr=0x00019034 vaddr=0x3ffb0000 size=0x0211c (  8476) load
I (119) esp_image: segment 4: paddr=0x0001b158 vaddr=0x3ffb211c size=0x00000 (     0) load
I (125) esp_image: segment 5: paddr=0x0001b160 vaddr=0x40080000 size=0x00400 (  1024) load
I (135) esp_image: segment 6: paddr=0x0001b568 vaddr=0x40080400 size=0x04aa8 ( 19112) load
I (149) esp_image: segment 7: paddr=0x00020018 vaddr=0x400d0018 size=0x15efc ( 89852) map
I (176) esp_image: segment 8: paddr=0x00035f1c vaddr=0x40084ea8 size=0x04b44 ( 19268) load
I (182) esp_image: segment 9: paddr=0x0003aa68 vaddr=0x400c0000 size=0x00000 (     0) load
I (183) esp_image: segment 10: paddr=0x0003aa70 vaddr=0x50000000 size=0x00000 (     0) load
I (191) esp_image: segment 11: paddr=0x0003aa78 vaddr=0x50000000 size=0x00000 (     0) load
I (206) boot: Loaded app from partition at offset 0x10000
I (207) boot: Disabling RNG early entropy source...
I (212) cpu_start: Pro cpu up.
I (216) cpu_start: Starting app cpu, e
<think>好的,我现在需要回答用户关于ESP32-S3-FH4-R2开发物联网设备是否需要外置Flash的问题。首先,我需要了解ESP32-S3-FH4-R2的基本配置,特别是内置存储的情况。根据用户提供的参考信息,他们提到在安装后选择ESP32S3 Dev Module,这可能涉及到开发板的配置,但具体到FH4-R2型号,我需要查阅官方资料。 ESP32-S3系列通常有不同的子型号,后缀如FH4-R2可能表示不同的内置Flash和PSRAM配置。例如,FH4可能代表4MB的Flash,而R2可能指代PSRAM的大小或其他特性。我需要确认FH4-R2的具体规格,尤其是内置Flash的大小,因为这是决定是否需要外置Flash的关键因素。 接下来,用户的应用场景是物联网设备。物联网设备通常需要存储固件、配置文件、OTA更新以及可能的用户数据。如果内置Flash足够容纳这些内容,外置Flash可能不必要。但若需要存储大量数据(如音频、视频、日志文件),或者进行复杂的OTA操作,外置存储可能有益。 此外,外置Flash的优势包括扩展存储空间、提升数据读写灵活性,并减少对内置存储的磨损。但也会增加硬件设计的复杂性和成本。因此,需要权衡利弊。 根据常见ESP32-S3型号,例如ESP32-S3-DevKitC-1,通常内置4MB Flash和2MB PSRAM。如果FH4-R2类似,那么4MB Flash对于大多数物联网应用已经足够,但具体还要看用户项目的需求。如果固件较大或需要存储大量数据,可能需要外置Flash。 最后,根据用户提供的引用,配置步骤中选择ESP32S3 Dev Module,这可能默认使用内置Flash,但开发板可能支持外置Flash的配置。建议用户查阅具体开发板的文档,确认内置存储是否满足需求,再决定是否需要扩展。</think>关于ESP32-S3-FH4-R2是否需要外置Flash,需从芯片设计、应用场景和存储需求三方面分析: 1. **芯片内置存储特性** ESP32-S3系列中,后缀`FH4-R2`的命名规则通常表示: - `F`:内置Flash - `H4`:Flash容量为4MB(不同厂商命名可能略有差异) - `R2`:PSRAM容量为2MB[^1] 因此该型号已集成4MB Flash,可满足多数物联网设备的基础需求,如固件存储、Wi-Fi配置和OTA更新。 2. **外置Flash的必要性判断条件** | 场景类型 | 存储需求 | 是否需要外置Flash | |---|---|--| | 简单传感器数据上报 | <2MB固件+<1MB日志 | 否 | | 语音识别/图像处理 | >4MB模型文件 | 是 | | 多版本OTA备份 | 需保留2个完整固件副本 | 是 | | 本地大数据缓存 | >3MB临时数据 | 是 | 3. **硬件设计权衡** - **优势**:外置Flash可通过QSPI接口扩展至16MB,支持XIP(就地执行)功能,适合需要直接运行外部存储代码的场景 - **成本影响**:增加$0.3-$1.5 BOM成本(取决于容量) - **功耗考量**:深度睡眠模式下外置Flash需断电,否则增加50-100μA待机电流 建议通过以下步骤验证: 1. 编译当前固件,查看`.bin`文件大小 2. 预估未来3年功能扩展所需的存储增量 3. 使用命令`esptool.py flash_id`读取实际芯片ID,确认内置Flash规格 若需外接Flash,需在Arduino IDE中配置: ```arduino #define BOARD_HAS_PSRAM // 启用PSRAM支持 #define FLASH_MODE_QIO // 设置Flash访问模式 ``` (具体配置需根据开发板手册调整)[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值