这两天在ESP32 IDF上移植了LVGL8.2,LVGL8.2已经内置了decoder,不需要再安装额外的库。但是,

lv_obj_t * wp;
    wp = lv_img_create(DictSense);
    lv_img_set_src(wp, "S:/ALBUM/wink.png");

将文件系统移植好后,把decoder打开:

esp32 ftp 照片 esp32传输图片_esp32 ftp 照片



先说解决方案:

解决方案

将 lv_conf.h中的

#  define LV_MEM_SIZE    (32U * 1024U)

把32改大(要确保你单片机的内存是否够)

如果使用了lvgl_esp32_drivers,则在menuconfig中:(默认32,单位KB


esp32 ftp 照片 esp32传输图片_嵌入式硬件_02


esp32 ftp 照片 esp32传输图片_esp32 ftp 照片_03

寻找过程

先给不太懂LVGL的新手科普一点,lv_conf.h是lvgl的配置文件,然而假如你使用了官方的,lvgl_esp32_drivers库,那么是不用管这个文件的,即使你把这个文件启用(设为1),还是没有用, lvgl_esp32_drivers已经将所有的设置项都搬到了menu config里面,只用在那里面设置就行了。(不过每改一次设置都要从头编译,真的很痛苦)

我先是以为是自己图片文件的问题,我去把官方的测试图片放进去依旧不行,但是电脑模拟器是可以的
然后我以为是文件系统的问题,换了文件系统还是不行

然后debug的话,首先要把LVGL的log打开

esp32 ftp 照片 esp32传输图片_文件系统_04


这里是不同的log等级,假如你开的最低级,他每一个事件都会报告,直接把esp32 CPU占满而基本无法运行 ,我选的是第2个等级,终于log出来了一点信息(只有打开错误这一句话)

但是没有关键信息,只是说错误代码是 LV_RES_INV

于是我又在绘图decode函数里面看了好长时间,不知道点到了什么,终于把关键信息给log出来了
动态分配内存的大小不够了啊!(调出这个log,用了一天的时间,我也不知道为什么开始没有log出内存不够这个信息)
原来如此!!!

esp32 ftp 照片 esp32传输图片_esp32 ftp 照片_05

关于文件系统

关于文件系统:其实esp32 IDF的文件系统是不用移植的,官方就兼容STDIO。直接把官方的SD卡例程的初始化复制进去 然后把LVGL的文件系统选择STDIO,配置一下即可。但是速度会比FATFS慢太多太多,还是建议使用lv_fs_if库。同样一个项目用if简直是秒出,用STDIO要等3秒。
文件系统移植教程: