ESP32-idf学习(五)esp32C3移植lvgl①
一、前言
上一篇我成功驱动了st7789,目前想用这块开发板做一个终端功能的设备,看到挺多人esp32用lvgl库的,我也移植一下试试。
二、创建新工程
我之前一直都是用的例程直接修改,主要是想快速修改然后能实现外设功能,检验一下。现在移植这个lvgl,后边肯定是一直在这个工程基础上继续修改的了,所以创建一个自己的工程吧:
这里点new project
填项目名称就好了
不知道为啥一定要选一个例程。我选了helloworld
三、目录结构调整
1、文件夹变更
还是习惯建src和inc这两个文件夹,然后放.c和.h文件
创建了inc和src两个文件夹,然后helloworld的我改成了app_main.c
2、CMakeList变更
在main里的CMakeList 改成包含src和inc的文件,我加了
3、程序变更
include的文件我放在一起
lcd里创建了一个task
lcd.h里声明
小小的测试一下:
ok,然后就可以开始lvgl
四、拉取所需库
1、lvgl库
百度搜索了一下,esp用lvgl的方法还是挺多的
我用的这个
vscode打开命令面板(ctrl+shit+p),输入>Show ESP Conponent Registry,点击
搜索lvgl
点击进去,可以安装,我是直接装的最新版本,
install或者添加依赖这个库
idf.py add-dependency "lvgl/lvgl^9.3.0"
安装成功后,会出来一个components,里边就是lvgl库
在根目录下的
2、驱动lvgl所需库
本来在上一章已经写好屏幕驱动spi和iic的函数,但是我看spi-touch这个例程,他直接拉取了这几个库,我感觉我好像做了无用功,因为我这款屏幕还是很常见的,esp都做好库直接调用就行了。之前写的就当检查硬件了
这是例程拉取的库
然后我搜索的时候,没找到有st7789的,触摸芯片的倒是找到了:
然后再拉取一个esp_lvgl_port
剩下的st7789,我没有找到,网上说集成在主库里的components里了,我也没有找到。
于是我又百度了一下(面向百度编程),找了一个相似的库 GC9A01
拉取下来后,全局替代 gc9A01 ==> st7789 GC9A01 == > ST7789,注意区分大小写。
然后这3个文件名改一下,全都改成st7789
这里也替换了
五、编写程序
1、显示部分初始化
这里基本就跟之前写lcd的一样,增加了面板初始化部分,都是能照抄的东西。
刷新的回调函数
2、触摸部分初始化
先初始化iic,gpio_install_isr_service这里我不加的话会报错,加的话会显示一条已经有地方安装过,但加了之后使用起来没问题,我就先没管了。
后边就是用下载的库了
3、lvgl初始化
主要要注意的就是添加触摸部分
lvgl的触摸回调函数
4、lvgl测试程序
我创建了一个显示的标题 LCD Test: PASS,一个显示坐标的Touch the screen,还有一个触摸点。实现点一下,显示坐标,并且在点的地方显示一个触摸点
这里的触摸点,搞了比较久,我一开始的现象是。初始化触摸控制器.swap_xy = 1,这个地方要设为1,坐标才会显示正确。但是坐标显示正确了,显示的触摸点Y坐标却是镜像的。我在更新触摸点那里打印了坐标,也是对的。最后不得已做了ST7789_HEIGHT - point.y这个处理。
最后我也没查出来是什么问题。后边进一步使用的时候看看。
六、验证程序及问题
视频:
lvgl触摸实例-CSDN直播
算是勉强移植成功吧。目前问题有3个。
1、颜色
我已经设置了rgb16位,但还是调不对,AI和网上搜的方法基本都用过,还是不行,这块真是知识盲区,得慢慢查查。
2、上文所说的触摸点显示镜像问题
但我显示的标题用lv_obj_align函数,位置却没错(我没理解的话)
3、字体有点模糊,而且还有点花
这个我要用之前没有移植lvgl前的程序显示一下文字试试,如果还有问题,可能就要用手上的stm32开发板驱动一下这个屏看看。但我感觉是不是lvgl9的问题?也可以换成低版本的lvgl试试。