Arduino esp32移植LVGL
关于lvgl 移植到SPI触摸屏,网上有很多教程,但都只提到了显示部分。对于触屏部分都没有写清楚。对于小白来说还是不明不白。买了这块屏后,从接线开始,研究了研究了一天,终于迁移成功了,写个总结。
硬件:普中esp32开发板、SPI触摸屏幕240*320



软件:Ardunio IDE, LVGL v8.3.8, TFT_eSPI
第一步:下载依赖包
下载LVGL依赖包,直接用IDE的包管理工具安装即可。如果因为网络问题无法安装,可到github上直接下载源码,复制到libraries 目录下。(注意:lvgl的master分支是9.0开发版本,语法跟V8大不相同,但是全部文档和示例都是V8的,因此需要下载V8.3的源码)
官方示例用的驱动是TFT_eSPI,所以还要下载TFT_eSP驱动包。方法同上。这个对版本没有要求,这次使用的是v2.5.31。
第二步:选择驱动
打开TFT_eSPI目目录下的User_Setup_Select.h 文件,选择对应的驱动头文件,取消对应行的注释,注释默认的行我这里选的是Setup42_ILI9341_ESP32.h
注意,只能选择一个驱动
点击刚刚选中的头文件,IDE会直接跳转到对应文件,文件对引脚的定义如下:
引脚5是触屏输入,默认不开启,我们之后会用到,先把这一行注释取消
我们先测试一下屏幕能不能正常显示。
按照上面引脚定义,把对应的引脚接上线。(TOUCH_CS 5 可以先不接)。屏幕上有字,对照接线即可。此外,还要接上电源(VCC,GND)和LED背光。我们没有对LED进行控制,直接接到3.3V电源
打开TFT_eSPI的examples\320 x 240\TFT_Clock, 打开TFT_Clock.ino 文件,编译上传到开发板。在屏幕上看到一个时钟,说明运行正常。(Ardunio IDE可以快速打开示例,请自己摸索)。
第三步:移植LVGL。
打开LVGL文件夹。复制lv_conf_template.h 到LVGL同级目录下,重命名为lv_conf.h,
最终目录结构如下:

修改lv_conf.h文件,把第一个#if改为1:
然后根据屏幕修改颜色属性,我的是16,不知道的话就默认值就好
复制官方lvgl\examples\arduino\LVGL_Arduino目录下的LVGL_Arduino.ino 到项目目录。然后修改文件,把行和高改成屏幕的行和高。(这个示例代码只需要改这一点就能用,下面的代码大部分只作分析,不需要修改)
在setup里初始化屏幕,官方代码如下:
flush_cb是一个回调函数,具体作用官方解释是把缓存写到屏幕上。具体怎么写,由用户自定义
官方实现代码如下,本质就是把lvgl的像素画到实际屏幕上,注意最后一句,每次写完后要通知lvgl
取消以下代码的注释:
编译上传到开发板。在屏幕正中央显示
Hello Ardino and LVGL!
说明移植成功。具体的实现可以看实例程序。如果编译时报函数没有定义错误,多半是版本问题。更换LVGL版本试试。
如果编译上传成功,屏幕一片空白,检查引脚是否接对。
到这一步屏幕能显示内容了,但还不能触摸,接下来实现触摸功能。
第四步:触屏功能实现
1首先回到引脚定义文件:
可见对于touch的引脚定义只有一个。但是屏幕上的引脚有5个,这要怎么接?这就涉及spi协议的规定,这里不细入。简单来说,多个设备可以共用同一个引脚,把触摸屏看成显示和输入两个设备,共用部分引脚。
一个主设备和多个从设备的SCK、MISO、MOSI,是共享线路的,而CS引脚在这里就起到了重要的作用。它能够让主设备选择某一时刻与哪一个从设备进行通信。因此我们只需要将主设备的SCK、MISO、MOSI引脚引出,然后将多个从设备的SCK、MISO、MOSI引脚分别接在引出的三条对应的线路上,最后通过程序设置CS引脚来分时的选通从设备,就可以在这里实现对触摸显示屏的正常驱动。
另外根据我们引脚定义的第一行说明(leave TFT SDO disconnected if other SPI devices share MISO) ,显示MISO 接口是不需要接的。所以只要共享SCK,MOSI 两个引脚即可

注:一个引脚接两个接口用面包板或直接让两个接口短路即可。
2、接下来移植lvgl。还是刚刚那个程序,下面这段代码是定义输入设备
my_touchpad_read 是一个自定义函数,把输入设备上的信息给到lvgl。具体实现官方源码
我们抄一个简单的按键demo试一下:定义一个button,按下去就改变文字
定义回调函数:
注释掉刚刚的测试代码,在后面添加:
编译上传,屏幕上可以正常显示一个button。点一下,没有反应。这是怎么回事?
一开始按网上教程做到这一步我也懵了,还以为是屏幕坏了,单独跑eSPI的触屏检测程序,结果正常。
到LVGL官网,看看官方怎么说。
https://docs.lvgl.io/master/get-started/platforms/arduino.html

注意说明 5. Set LV_TICK_CUSTOM
打开配置文件lv_conf.h,找到 LV_TICK_CUSTOM
使用自定义时钟源,不需要使用`lv_tick_inc()手动更新。也就是说要把ardunio的时钟信号给加上。改一下配置,启用arduino的时钟信号:
保存后再次编译上传,成功。
这个配置很重要,网上很多 教程都没提到。
这篇是我的实践,做个笔记,供大家参考吧。