开发环境:esp-idf
MCU:ESP32
TFT屏幕:ST7796
触摸驱动:XPT2046
LVGL版本:8.4
PS:因为移植v9版本失败了,所以换回来v8了,但是用到的包似乎已经很久没有维护了
需要的资料
1.LVGL源码包下载地址
2.lvgl_esp32_drivers包下载地址
基本构建
1.在工程根目录中先创建components,然后将下载好的LVGL源码包跟驱动包复制到components文件夹下面,然后在idf中输入idf.py menuconfig构建工程
mkdir components
idf.py menuconfig
2.在这里开始配置屏幕的显示驱动以及触摸驱动(图片上方有路径)
同时在这里还可以配置屏幕的引脚以及翻转、背光等等,根据自己的需求配置,对触摸的触动配置同理。配置完保存退出。
LVGL接入显示驱动以及触摸驱动
轮子已经是包体给我们造好的了,我们要做的工作是将他们提供的接口接入到LVGL里面去,这里可以参照LVGL的示例,具体路径为components\lvgl\examples,
lv_port_disp_template.c是显示驱动的接入示例
lv_port_indev_template.c是触摸驱动的接入示例
1.在lvgl_helper.h这个文件中添加一下宏定义,这是屏幕的分辨率
#define LV_HOR_RES_MAX 320
#define LV_VER_RES_MAX 480
2.参考示例文件写自己的驱动函数
static void my_touch_init(void)
{
//xpt2046_init(); //触摸配置
//添加触摸到lvgl
static lv_indev_drv_t indev_drv;
lv_indev_drv_init( &indev_drv );
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = xpt2046_read;
lv_indev_drv_register( &indev_drv );
}
static void my_disp_init(void)
{
lvgl_driver_init(); //TFT驱动初始化
/* Example for 1) */
static lv_disp_draw_buf_t draw_buf_dsc_1;
static lv_color_t buf_1[LV_HOR_RES_MAX * 10]; /*A buffer for 10 rows*/
lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/
// /* Example for 2) */
// static lv_disp_draw_buf_t draw_buf_dsc_2;
// static lv_color_t buf_2_2[LV_HOR_RES_MAX * 10]; /*An other buffer for 10 rows*/
// lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/
/* Example for 3) also set disp_drv.full_refresh = 1 below*/
// static lv_disp_draw_buf_t draw_buf_dsc_3;
// static lv_color_t buf_3_1[LV_HOR_RES_MAX * LV_HOR_RES_MAX]; /*A screen sized buffer*/
// static lv_color_t buf_3_2[LV_HOR_RES_MAX * LV_HOR_RES_MAX]; /*Another screen sized buffer*/
// lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2,
// LV_HOR_RES_MAX * LV_VER_RES_MAX); /*Initialize the display buffer*/
/*-----------------------------------
* Register the display in LVGL
*----------------------------------*/
static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
/*Set up the functions to access to your display*/
/*Set the resolution of the display*/
disp_drv.hor_res = LV_HOR_RES_MAX;
disp_drv.ver_res = LV_VER_RES_MAX;
/*Used to copy the buffer's content to the display*/
disp_drv.flush_cb = st7796s_flush;
/*Set a display buffer*/
disp_drv.draw_buf = &draw_buf_dsc_1;
/*Required for Example 3)*/
//disp_drv.full_refresh = 1;
/* Fill a memory array with a color if you have GPU.
* Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
* But if you have a different GPU you can use with this callback.*/
//disp_drv.gpu_fill_cb = gpu_fill;
/*Finally register the driver*/
lv_disp_drv_register(&disp_drv);
}
注意这里根据自己的屏幕来改动
indev_drv.read_cb = xpt2046_read;
disp_drv.hor_res = LV_HOR_RES_MAX;
disp_drv.ver_res = LV_VER_RES_MAX;
/*Used to copy the buffer's content to the display*/
disp_drv.flush_cb = st7796s_flush;
总结:
因为移植这个踩了很多坑,分享一下自己的移植思路。首先要明确自己的显示驱动以及触摸驱动,这个可以通过idf的组件管理器来查找相对应的驱动,找不到也没关系,驱动写的都差不多,一般改一下那个初始化的命令码就可以用起来了。
成功驱动显示以及触摸之后,就去找LVGL接入驱动的API,根据示例文件改一下就可以了。