前言

最近在做一个基于ESP32的项目,ESP32虽然官方声称自带多达520KB的RAM,比起同价位的STM32可以说是十分良心。

然而在做项目的时候发现,这520KB的RAM实际能用的其实没有想象中那么多,特别是ESP32在开启WiFi后会占掉这里面的一大部分。而且我的项目中有用到显示屏,那么这几百KB的RAM就更不够用了。经过我自己的测试,240X240的屏幕在LVGL并不能开启双缓冲全屏刷新。简单计算一下,不算其他的内存开销,实现240X240屏幕的双缓冲全屏刷新只需要240x240x(16/8)x2=230400B=225KB的RAM,只占了一半多一点而已。
所以说如果想使用ESP32驱动大一点的屏幕之余,又想使用较高效率的刷新方式的话,那么增添外部RAM会更好,ESP32目前只支持自己的PSRAM,有4MB和8MB两个版本,具体看自己买的型号或厂商说明。



关于在IDF架构下使用PSRAM网上一般都有教程,但我找了一圈也找不到Platformio下PSRAM的开启方法,于是我只能靠看Arduino的底层源码,最终找到了解决方法。

源码分析

首先,要开启PSRAM,要先找到PSRAM相关的代码。对应文件名为esp32-hal-psram.c和esp32-hal-psram.h。
先看esp32-hal-psram.c文件。

一上来就可以看到“#if CONFIG_SPIRAM_SUPPORT || CONFIG_SPIRAM”这个预编译指令决定了程序会不会导入PSRAM相关的代码。从上面看到很明显没有导入,这时我以为并没有定义这两个标识符。这两个标识符是在sdkconfig.h中定义的。

从上图可以看到两个标识符都被定义了,而且值为1,所以就不是这里的问题。于是我又看了一下esp32-hal-psram.h文件,就发现了突破点。

上面展示的宏定义看上去很复杂,但简单说就是如果没有定义BOARD_HAS_PSRAM,那么就会取消定义CONFIG_SPIRAM_SUPPORT和CONFIG_SPIRAM。
那么问题就迎刃而解了,我们只需要全局定义BOARD_HAS_PSRAM即可开启PSRAM

教程

创建一个Platformio的ESP32项目,一般只要是ESP32芯片对应的板子即可,我选择的是Espressif ESP-WROVER-KIT,架构选Arduino。


创建项目成功后打开platformio.ini文件,内容应该是这样的。


在最后一行添加下面的命令:

build_flags = -D BOARD_HAS_PSRAM

修改后的文件是这样的。

这时候简单在main文件写一个代码看看PSRAM有没有正常识别。

#include #include void setup() {Serial.begin(115200);Serial.printf("Deafult free size: %d\n", heap_caps_get_free_size(MALLOC_CAP_DEFAULT));Serial.printf("PSRAM free size: %d\n", heap_caps_get_free_size(MALLOC_CAP_SPIRAM));}void loop() {// put your main code here, to run repeatedly:}

在串口助手可以看到打印的信息。

PSRAM的可用大小为4192139B≈4MB,所以我手上这个模块的PSRAM为4MB的版本。