ESP32 PSRAM与Flash详解

一、硬件说明

模块型号:ESP32‑WROOM‑32UE‑MQN4R2 主控芯片:ESP32‑D0WD‑V3(双核 LX6,非 ESP32C3) 存储配置:4MB Flash + 2MB PSRAM 编译目标:esp32

二、Flash 与 PSRAM 核心区别

很多新手分不清两者用途,一句话总结: Flash(4MB)= 硬盘:断电数据不丢失,存固件、网页文件、NVS 配置参数 PSRAM(2MB)= 扩展内存条:断电数据清空,只用于程序运行时大缓存

ESP32 原生内部 SRAM 仅 520KB,处理图片、HTTP 大缓冲区极易溢出,PSRAM 就是用来解决内存不足的。

三、必须开启的配置

idf.py menuconfig 开启如下选项: Component config → ESP32‑specific → Support for external SPI RAM

编译指令:

idf.py set-target esp32idf.py build flash monitor

四、完整实战源码(可直接运行)

功能:打印设备存储信息、测试内部内存溢出、测试 PSRAM 读写

#include <stdio.h>#include <string.h>#include "freertos/FreeRTOS.h"#include "freertos/task.h"#include "esp_system.h"#include "heap_caps.h"#include "nvs_flash.h"#include "spi_flash.h"// 打印Flash、内部RAM、PSRAM信息void print_mem_info(void){    size_t int_free = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);    size_t psram_free = heap_caps_get_free_size(MALLOC_CAP_SPIRAM);    printf("========== 存储信息 ==========\n");    printf("内部SRAM空闲:%d KB\n", (int)(int_free / 1024));    printf("PSRAM空闲:%d KB\n", (int)(psram_free / 1024));    uint32_t flash_size = spi_flash_get_chip_size();    printf("Flash总容量:%d MB\n", (int)(flash_size / 1024 / 1024));    printf("==============================\n");}void psram_test_task(void *arg){    print_mem_info();    // 1.测试:内部RAM申请1MB内存(必然失败)    uint8_t *int_buf = malloc(1024 * 1024);    if (int_buf == NULL)    {        printf("【测试通过】内部RAM不足,1MB申请失败\n");    }    else    {        free(int_buf);    }    // 2.测试:PSRAM申请1MB大缓存(正常成功)    uint8_t *psram_buf = heap_caps_malloc(1024 * 1024, MALLOC_CAP_SPIRAM);    if (psram_buf != NULL)    {        printf("【测试通过】PSRAM 1MB内存申请成功\n");        // 读写测试        memset(psram_buf, 0x66, 1024 * 1024);        if (psram_buf[0] == 0x66)        {            printf("【测试通过】PSRAM读写正常\n");        }        heap_caps_free(psram_buf);        printf("PSRAM内存已释放\n");    }    else    {        printf("【报错】未开启PSRAM配置!\n");    }    while (1)    {        vTaskDelay(pdMS_TO_TICKS(3000));    }}void app_main(void){    // 初始化NVS闪存    esp_err_t ret = nvs_flash_init();    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)    {        nvs_flash_erase();        nvs_flash_init();    }    // 创建测试任务    xTaskCreate(psram_test_task, "psram_test", 4096, NULL, 5, NULL);}

五、正常运行日志

========== 存储信息 ==========内部SRAM空闲:380 KBPSRAM空闲:1950 KBFlash总容量:4 MB==============================【测试通过】内部RAM不足,1MB申请失败【测试通过】PSRAM 1MB内存申请成功【测试通过】PSRAM读写正常PSRAM内存已释放

发表评论