最近在研究如何使用esp-idf来在esp32上使用lvgl。在网上查看到的许多教程都是基于lv_port_esp32完成的,但是这个库已经很久没更新了,并且使用的是idf4.2;然后还有一些教程需要修改许多地方,看着就头疼。
但是最后发现,其实官方已经给我们了一个LVGL的demo,如果屏幕驱动芯片和demo里的一样的话,是直接可以编译运行的,不需要什么额外的配置。而且LVGL其实是可以作为工程的一个component,并且支持通过menuconfig直接进行配置,十分的方便。下面就来介绍一下实现流程。
操作环境
操作系统:Ubuntu
IDF:5.1
LVGL:8.3.11
芯片:ESP32S3
我这里采用操作系统是Ubuntu,在Linux环境下使用idf是十分的丝滑,并且编译速度很快。
LVGL采用的是8.3.11版本,按理来说应该是支持更高版本的LVGL,但是由于Squareline Studio里最大支持的lvgl版本为8.3.11,因此我们这里也默认使用8.3.11版本。
移植步骤
新建工程
我们首先将demo工程“spi_lcd_touch”复制出来。
我们可以在main文件夹中的“idf_component.yml”文件中可以看到这个工程需要用到的库。
其中"esp_lcd_ili9341"、“esp_lcd_gc9a01”、"esp_lcd_touch_stmpe610"分别为两个屏幕ic和一个触摸ic。
之后我们要根据我们开发板芯片的不同设置不同的target
idf.py set-target esp32 #设置目标芯片为esp32
idf.py set-target esp32s3 #设置目标芯片为esp32s3
在构建工程的时候这些需要的库将会自动下载到“manage_components”文件夹中,我们可以打开看一下,在文件夹中我们可以看到其中包含,以及屏幕和触摸的驱动。
我们先执行命令构建一下工程。
idf.py build
可以看到项目构建成功。
虽然在前面步骤中我们已经添加了相关的库文件,但是在我们需要清理工程文件,也就是执行“idf.py fullclean”的时候,“manage_components”文件夹也会被清理掉,在下次构建工程的时候还需要下载,十分的不方便。
因此我们可以将该文件夹下的文件移动到“components”文件夹下(如果没有该文件夹可以自行新建一个),该文件夹下的文件在清理工程的时候不会被删除。并且如果我们需要什么其它的库文件,也都可以直接添加到该文件夹中,十分的方便。
适配屏幕及触摸
该demo中默认支持的屏幕驱动为gc9a01、ili9341,触摸ic为stmpe610。由于每个人使用的屏幕尺寸和驱动ic以及触摸ic的型号都有所不同,因此在很多情况下我们还要对屏幕驱动以及触摸驱动进行修改。
寻找驱动
首先我们需要找到与我们屏幕对应的驱动,这个其实已经有很多前辈给我们写过了,我们只用站在巨人的肩膀上即可。这里推荐一个官方的下载网站esp components,这里面有很多我们可以用到的库,包括屏幕驱动,触摸驱动,cam驱动等各种可能会用到的库。
在使用时,我们只需要在其中搜索并将下载的文件夹放到我们的“components”文件夹中即可;也可以使用官方推荐的
idf.py add-dependency "*****"
后一种方式还是在编译工程的时候自动下载到“manage_components”文件夹。
个人还是推荐第一种方法。
修改屏幕驱动
在下载好对应驱动之后,我们需要将demo中的驱动修改为我们自己屏幕对应的驱动。
由于我这里屏幕驱动为demo中已经包含的ili9341,因此这里我只简要介绍一下修改方法。
- 首先添加对应的头文件
- 将”esp_lcd_new_panel_ili9341“改为”esp_lcd_new_panel_“,其中就是你自己使用的屏幕ic型号。
修改触摸驱动
如果我们的屏幕还有触摸功能的话,我们还要修改对应的触摸驱动。我的屏幕触摸ic为xpt2046。demo中的默认驱动为stmpe610,这里我们首先要下载xpt2046的驱动到components文件夹中,并将其头文件包含进来。由于该ic也是使用spi进行驱动,并且参考其驱动示例发现,使用方法和stmpe610类似,但函数名称有所不同,因此仅需要将文件中的函数名称进行修改即可
ESP_ERROR_CHECK(esp_lcd_touch_new_spi_xpt2046(tp_io_handle, &tp_cfg, &tp));
我这里是参考stmpe610的方法添加了宏。
-
首先在main函文件夹下的”Kfconfig.projbuild“的“EXAMPLE_LCD_TOUCH_CONTROLLER“选项中添加我们自己的触摸ic:XTP2046
-
在“spi_lcd_touch_example_main.c”文件中出现“STMPE610”的地方,仿照其格式添加我们自己的触摸ic配置。(没记错的话应该就以下三处)
-
在menuconfig的Example Configuration中修改触摸ic的选择(menuconfig如何进入在下一节的“LVGL相关设置”中会介绍)
设置完成后保存退出即可。
此外,在“spi_lcd_touch_example_main.c”文件中我们可以看到,触摸ic和屏幕驱动ic是共用CLK、MISO、MOSI三根线的,如果你的屏幕上触摸ic和屏幕驱动ic这三根线是相互独立的话,需要用烙铁分别将它们连接起来,才能够正常使用触摸。
此外,在实际测试中,发现我的触摸会关于屏幕短边镜像,修改tp_cfg中的mirror_x也没有用,具体原因不明,我是在example_lvgl_touch_cb函数中进行了如下修改才得以更正(大家如果知道是什么原因的话欢迎指正)
LVGL相关设置
在ESP-IDF中,我们是可以直接使用menuconfig图形化界面来设置LVGL的相关参数的,进入图形化界面的命令为
idf.py menuconfig
之后在Component config中就能找到lvgl配置选项如下:
在其中我们选择显示CPU和内存状态
下载测试
在以上工作完成后,我们将程序烧录到我们的开发板上,就能看到效果了。
更换我们自己设计的UI
UI的设计这里我采用的是SquareLine Studio,版本为1.4.0。该软件有个人版本,不收费,能免费使用,但是创建的页面个数和控件个数会有所限制。具体的使用方法可以在b站上搜索相关教程。
这里我创建了一个测试的demo,项目设置、界面和导出的文件夹如下:
这里我将其作为一个库放进了esp-idf的工程中的“components”文件夹下。
这里我们要修改其中的CMakeist.txt文件,使其符合idf工程要求
之后我们将原demo中的显示示例“example_lvgl_demo_ui(disp)”注释掉并添加我们自己创建的界面“ui_init()”。
重新下载测试
重新编译下载后的效果如下,说明我们移植成功
需要完整代码请在公众号:通信电子坊,回复:“ESP-IDF移植LVGL”获取。