一、硬件说明
模块型号: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 读写
// 打印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内存已释放