【ESP32】VSCode+Arduino+Platformio 如何使用ESP32上的PSRAM

前言

最近在做一个基于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 <Arduino.h>
#include <esp_heap_caps.h>

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的版本。

  • 10
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马浩同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值