1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【ESP32】VSCode+Arduino+Platformio 如何使用ESP32上的PSRAM

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

时间:2022-10-06 08:44:29

相关推荐

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。