【ESP32】Arduino+LVGL 如何使用PSRAM优化显示

这篇具有很好参考价值的文章主要介绍了【ESP32】Arduino+LVGL 如何使用PSRAM优化显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近项目需要买了一个ESP-WROVER-E模块,这个模块内置了一个4MB的PSRAM,对于需要大内存运行的场景非常友好。

【ESP32】Arduino+LVGL 如何使用PSRAM优化显示
【ESP32】Arduino+LVGL 如何使用PSRAM优化显示
在我的项目中用到了LVGL这个第三方图形库,下面就讲一下如何最大化地在LVGL中使用这个PSRAM。

教程

在lv_conf.h文件中,找到下面的代码。

/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/
#define LV_MEM_CUSTOM 1
#if LV_MEM_CUSTOM == 0
    /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
    #define LV_MEM_SIZE (48U * 1024U)          /*[bytes]*/

    /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
    #define LV_MEM_ADR 0     /*0: unused*/
    /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
    #if LV_MEM_ADR == 0
        #undef LV_MEM_POOL_INCLUDE
        #undef LV_MEM_POOL_ALLOC
    #endif
    
#else       /*LV_MEM_CUSTOM*/
    #define LV_MEM_CUSTOM_INCLUDE <stdlib.h>   /*Header for the dynamic memory function*/
    #define LV_MEM_CUSTOM_ALLOC   malloc
    #define LV_MEM_CUSTOM_FREE    free
    #define LV_MEM_CUSTOM_REALLOC realloc
#endif     /*LV_MEM_CUSTOM*/

默认情况下LV_MEM_CUSTOM为0,这时LVGL会自己弄一个内存池进行管理,这个内存池是使用ESP32的SRAM,而ESP32能用的SRAM实际大小也就320KB。
如果ESP32上自带PSRAM的话,可以将LV_MEM_CUSTOM设为1,这时LVGL将使用stdlib.h头文件内的函数分配内存,而使用这些函数分配内存是可以充分使用到SRAM和PSRAM的内存的

接下来修改与显示有关的代码。官方会提供3个显示刷新的方案——单缓冲10行刷新、双缓冲10行刷新和双缓冲全像素刷新。如果我们的ESP32上自带PSRAM,那么肯定尽可能选择刷新速度最快的双缓冲全像素刷新方式,但在用之前函数最好还是计算一下内存的占用,大一点的屏幕在该模式下要占满4MB的内存也不是不可能的。

void Display::init(void)
{
    display_init();

    // static lv_disp_draw_buf_t draw_buf_dsc_1;
    // static lv_color_t buf_1[MY_DISP_HOR_RES * 10];                          /*A buffer for 10 rows*/
    // lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10);   /*Initialize the display buffer*/

    // static lv_disp_draw_buf_t draw_buf_dsc_2;
    // static lv_color_t buf_2_1[MY_DISP_HOR_RES * 10];                        /*A buffer for 10 rows*/
    // static lv_color_t buf_2_2[MY_DISP_HOR_RES * 10];                        /*An other buffer for 10 rows*/
    // lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 10);   /*Initialize the display buffer*/

    static lv_disp_draw_buf_t draw_buf_dsc_3;
    // static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*A screen sized buffer*/
    // static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*Another screen sized buffer*/
    lv_color_t* buf_3_1 = (lv_color_t*) heap_caps_malloc(MY_DISP_HOR_RES * MY_DISP_VER_RES, MALLOC_CAP_SPIRAM);
    lv_color_t* buf_3_2 = (lv_color_t*) heap_caps_malloc(MY_DISP_HOR_RES * MY_DISP_VER_RES, MALLOC_CAP_SPIRAM);
    lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, MY_DISP_VER_RES * MY_DISP_HOR_RES);   /*Initialize the display buffer*/
    static lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/
    lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/

    /*Set the resolution of the display*/
    disp_drv.hor_res = MY_DISP_HOR_RES;
    disp_drv.ver_res = MY_DISP_VER_RES;
    /*Used to copy the buffer's content to the display*/
    disp_drv.flush_cb = my_disp_flush;
    disp_drv.full_refresh = 1;
    /*Set a display buffer*/
    disp_drv.draw_buf = &draw_buf_dsc_3;

    /*Finally register the driver*/
    lv_disp_drv_register(&disp_drv);
}

在开辟屏幕的2个缓冲区时,我并没有使用stdlib.h头文件中的malloc函数,而是使用esp_heap_caps.h头文件中的heap_caps_malloc函数,因为该函数可以决定内存空间开辟的方式,第二个参数填入MALLOC_CAP_SPIRAM,这样该空间会被强制开辟在PSRAM中。
如果我们用了双缓冲全像素刷新,记得在注册显示设备时加上下面的代码。

disp_drv.full_refresh = 1;

这样是告诉LVGL我们的程序可以进行全像素刷新。

接下来还可以进行一些额外的设置,我们可以在lv_conf.h文件找到下面的代码。

/*Default display refresh period. LVG will redraw changed areas with this period time*/
#define LV_DISP_DEF_REFR_PERIOD 20      /*[ms]*/

/*Input device read period in milliseconds*/
#define LV_INDEV_DEF_READ_PERIOD 10     /*[ms]*/

第一个设置的是屏幕的刷新频率,默认为30ms刷新一次,我设置到了20ms刷新一次,那么最高就可以有50fps的帧率。第二个是设置输入设备的采样频率,默认为20ms采样一次,我设置到了10ms,这样可以尽可能提高触摸的灵敏度。

总结

可能有同学在设置了上面的参数后仍然发现屏幕好像还是卡卡的,这是因为以上都是在软件层面进行的优化,软件的优化是有限的,不如直接在硬件上进行优化。
就比如,我使用的屏幕虽然只有240X240的分辨率,但它使用的是SPI协议进行通信,相比起使用8080并口的显示屏,刷新速度肯定是大打折扣的;前者每次传输1bit,但后者每次可以传输8bit或16bit,这个差距是巨大的。
又比如,PSRAM虽然有4MB的空间,看上去很大,但它走的也是SPI协议;而我们平时用的SRAM或SDRAM都是使用好几个管脚进行寻址和传数据,速度上面没得比。但PSRAM的好处就是空间大,SDRAM、SRAM的空间一般只能做几百KB。文章来源地址https://www.toymoban.com/news/detail-481183.html

到了这里,关于【ESP32】Arduino+LVGL 如何使用PSRAM优化显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用 Arduino ESP32 将数据存储到 microsdcard(软 SPI )

    esp32从传感器记录的数据或者日志,并将这些数据保存到SD卡中 1.我们将使用图书馆SD卡进行通信。您可以在此处下载: https://github.com/nhatuan84/esp32-micro-sdcard 下载后,解压缩并将其解压缩到Arduino文件夹下的库文件夹中: 2.格式化 microSD 卡: 将 microSD 卡与 ESP32 配合使用时,应先

    2024年02月08日
    浏览(31)
  • ESP32 直接使用WIFI进行UDP通信, 将光敏电阻传感器数值, 显示在OLED上 - 米思齐/Arduino

    ESP32主: 读取光敏传感器数值, 并通过UDP发送 ESP32从: 读取主机发送的数值, 并显示在OLED显示屏上 左边为ESP32, 连接OLED, 为STA模式从机 右边为ESP32, 连接光敏传感器, 为AP+STA主机, 可连接外网和连接从机

    2024年02月13日
    浏览(168)
  • ESP32连接电脑后端口不显示,arduino ide端口灰色

    我自己的esp32用数据线连接电脑后,在Arduino ide中端口为灰色,而且在设备管理器中也找不到对应的端口设置。   情况一:检查esp32连接电脑的数据线,如果是单纯的供电线是不可以的,需要更换为能传输数据的数据线。 情况二:缺少esp32的驱动程序cp210x,下载驱动并安装 链

    2024年02月11日
    浏览(51)
  • TFT屏幕在arduino (esp 32)下的驱动,汉字显示和字库比较

    绝大多数的tft屏幕在esp32 下都可以被 TFT_eSPI 驱动显示,以下清单中的驱动模块都可以用tft_espi来显示: 上面的驱动表基本囊括了主要的TFT显示模块,所以除非不在这个清单中,所以别找第三方驱动了。 二、TFT模块的汉字显示方式和字库调用 在TFT_eSPI 的官方系统中提供了pro

    2024年02月07日
    浏览(42)
  • ESP32 入门笔记04: 0.96寸OLED 显示屏 + u8g2库丝滑显示UI (ESP32 for Arduino IDE)

    先导知识 ESP32 入门笔记01:开发板信息、开发环境搭建以及学资料准备 ESP32 入门笔记02: GPIO参考指南 在本例中,我们使用 I2C 通信协议。ESP32 中最适合 I2C 通信的引脚是通用输入输出接口 22(SCL) 和通用输入输出接口 21(SDA) 。 安装 SSD1306 OLED 库 – ESP32 (也可以用u8g2库,在Ardu

    2024年01月19日
    浏览(52)
  • arduino-esp32:基于TFT-eSPI库实现触摸显示屏

    在arduino的IDE上已经搭建好了ESP32环境的话,写写小应用的话还是很简单的,毕竟有这么多优秀的库。 之前用自己买的TFT屏试了一下TFT-eSPI库的驱动效果,显示效果挺好的,但是触摸一直没用上。最近有空了弄了一下。 我的屏幕是2.2寸/2.4/2.8/3.2/3.5/4.0寸TFT触摸彩色SPI串口液晶屏

    2023年04月09日
    浏览(39)
  • ESP32在ESP-IDF框架下使用LVGL(v8.3)

    VSCode + ESP-IDF 插件 说明: IDF版本为4.4.4 ,最新版的5.0.1弃用了些东西,而lvgl_esp32_drivers对5以上的版本未适配,所以 不建议使用5以上的版本 。 安装:安装教程,建议整体看完在进行安装,以免安装失败, 教程安装的是5.0.1,需要改为4.4.4 。 Arduino移植教程:点击此处 lvgl :g

    2023年04月16日
    浏览(65)
  • ESP32 s3 PSRAM ID read error: 0x00ffffff 已解决。

    使用 ESP32-S3 N16R8 报错 原因是ESP32-S3R8模块内置的RSRAM 为八线模式PSRAM(OCTAL MODE PSRAM) 在menuconfig中配置 即可正常识别。 补充内容: 怎么查看芯片集成的PSRAM是什么模式的SPI呢?由于ESP-32S3的PSRAM是集成在封装内的,所以直接查看芯片数据手册,这里摘抄了相关的内容。 在八线P

    2024年02月12日
    浏览(65)
  • Arduino下如何快速安装esp32库,一分钟搞定!!

            对于很多要使用esp32的新手来说,都需要在自己的编辑器的环境下安装esp32库,网上对于在Arduino下的安装esp32库主要有三种:        第一种:添加库地址下载,这种最简单,但需要科学上网,对于大多数人来说是很不方便的。        第二种:离线式下载,将安装包

    2024年02月11日
    浏览(41)
  • 【ESP32】arduino中的ESP32实时系统FreeRTOS使用教程(一)

    简单的本节略过,详细的可以看视频:单片机ESP32上的FREERTOS这个作者讲的挺好的,通俗易懂 FreeRTOS中的任务有运行态、就绪态、阻塞态、挂起态四种状态,在任何时候都只处于其中一种状态。任务状态之间的转换如下图所示: 每一个任务都会有一个任务优先级,其范围为

    2023年04月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包