【ESP32-S3-CAM】ARDUINO IDE启用PSRAM

📅 2026/8/8 14:02:32
【ESP32-S3-CAM】ARDUINO IDE启用PSRAM
【ESP32-S3-CAM】ARDUINO IDE启用PSRAM在Arduino环境中开启PSRAM常见问题与解决PSRAM适合处理音频、图像等大文件避免内部DRAM不足的问题。在Arduino环境中开启PSRAM如果使用Arduino IDE开发ESP32-S3-CAM步骤更简单确保已安装最新的ESP32 Arduino核心版本≥2.0.0。在代码开头添加PSRAM启用宏#defineCONFIG_SPIRAM_SUPPORT1// 启用PSRAM支持选择开发板时勾选“PSRAM”选项工具 → 开发板 → 选择“ESP32S3 Dev Module”工具 → PSRAM → 选择“Enabled” 或者“OPI PARAM”下面三段代码可以验证PSRAM是否可用voidsetup(){Serial.begin(115200);if(ESP.getPsramSize()0){Serial.printf(PSRAM已启用总大小: %d KB\n,ESP.getPsramSize()/1024);}else{Serial.println(PSRAM未启用);}}voidloop(){vTaskDelay(pdMS_TO_TICKS(100));}#includeesp_heap_caps.hvoidapp_main(){// 检查PSRAM是否可用if(heap_caps_get_total_size(MALLOC_CAP_SPIRAM)0){ESP_LOGI(TAG,PSRAM已启用总大小: %d KB,heap_caps_get_total_size(MALLOC_CAP_SPIRAM)/1024);}else{ESP_LOGE(TAG,PSRAM未启用或硬件不支持);}}// 从PSRAM分配1MB内存用于存储音频、图像等大文件uint8_t*psram_buffer(uint8_t*)heap_caps_malloc(1024*1024,MALLOC_CAP_SPIRAM);if(psram_bufferNULL){ESP_LOGE(TAG,PSRAM内存分配失败);}else{ESP_LOGI(TAG,PSRAM内存分配成功);// 使用完毕后释放heap_caps_free(psram_buffer);}常见问题与解决PSRAM分配失败检查menuconfig是否正确勾选“Enable PSRAM”。确认硬件上PSRAM芯片是否完好ESP32-S3-CAM偶尔因焊接问题导致PSRAM不可用。启用PSRAM后程序崩溃首先这两个选项轮流试试然后使用下面代码测试看是否可以#include esp_heap_caps.hvoid setup(){Serial.begin(115200);delay(2000);//等待串口就绪 Serial.println(准备分配内存...);uint8_t*psram_buffer(uint8_t*)heap_caps_malloc(1024,MALLOC_CAP_SPIRAM);if(psram_bufferNULL){Serial.println(PSRAM内存分配失败);}else{Serial.println(PSRAM内存分配成功);delay(1000);//暂停1秒确认分配后系统正常 Serial.println(准备释放内存...);heap_caps_free(psram_buffer);Serial.println(内存释放成功);}}void loop(){vTaskDelay(pdMS_TO_TICKS(100));}Arduino中无法启用PSRAM升级ESP32 Arduino核心至最新版本通过 Boards Manager。确认开发板选择正确必须是支持PSRAM的型号。2026年8月7日12:15:56 崩溃处理新买的板子配置没有问题但是不停重启崩溃日志如下00:59.933 - load:0x403cb700,len:0x30b4 12:00:59.933 - entry 0x403c88b8 12:01:02.036 - 准备分配内存... 12:01:02.036 - PSRAM内存分配成功 12:01:03.049 - 准备释放内存... 12:01:03.049 - 内存释放成功 12:01:08.010 - E (16112) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time: 12:01:08.050 - E (16112) task_wdt: - IDLE0 (CPU 0) 12:01:08.050 - E (16112) task_wdt: Tasks currently running: 12:01:08.050 - E (16112) task_wdt: CPU 0: loopTask 12:01:08.050 - E (16112) task_wdt: CPU 1: IDLE1 12:01:08.050 - E (16112) task_wdt: Aborting. 12:01:08.050 - E (16112) task_wdt: Print CPU 0 (current core) backtrace经过排查最后才发现是loop里面是空的就是没有写代码看门狗明确指出了是 loopTask也就是你的 loop() 函数一直霸占着 CPU 0导致 IDLE0 任务饿死。所以只需要在loop函数里加个代码就好void loop() { vTaskDelay(pdMS_TO_TICKS(100)); }