一,文件准备
进入官网获取源码https://lvgl.io/
二,进行裁剪
下载好的源码我们只需留下这些文件
接着继续对examples文件夹进行裁剪,我们只需要留下porting
最后进给lv_conf_template.h改个名字,改为 lv_conf.h,得到最终的文件
三,移植到个人的工程
读者需要在自己的工程中创建一个文件夹,如下:
创建文件甲的结构为:
将剪裁好的源码放入lvgl的文件夹下:
在Keil中添加文件:
创建相应文件夹:
Middlewares/lvgl/examples/porting 组添加 Middlewares/LVGL/GUI/lvgl/examples/porting 目录下的 lv_port_disp_template.c 和 lv_port_indev_template.c 文件
![](https://i-blog.csdnimg.cn/blog_migrate/03bcefb680eb0fdcff8c5f9dd44e6767.png)
往 Middlewares/lvgl/src/core 分组中添加 core 文件夹下的全部.c 文件
![](https://i-blog.csdnimg.cn/blog_migrate/aa0c0ca531767da9b2f0483b3fad9dcd.png)
往 Middlewares/lvgl/src/extra 组中添加 extra 文件夹下除了 lib 文件夹之外的全部.c 文件
往 Middlewares/lvgl/src/font 组中添加 font 文件夹下的全部.c 文件
![](https://i-blog.csdnimg.cn/blog_migrate/c0c98907cc85c37a45d9af0fadf9cd39.png)
往 Middlewares/lvgl/src/hal 组中添加 hal 文件夹下的全部.c 文件
往 Middlewares/lvgl/src/misc 组中添加 misc 文件夹下的全部.c 文件
往 Middlewares/lvgl/src/widgets 组中添加 widgets 文件夹下的全部.c 文件
添加头文件
在main.c中加入相应头文件
添加心跳(在添加心跳前你需要初始化一个1ms的时钟,并开启中断):
在main函数中进行初始化
在while(1)中加入LVGL调用函数
![](https://i-blog.csdnimg.cn/blog_migrate/d129e3213b3dc49b75e7048a2929aae0.png)
其他如法炮制。
四,对接LCD显示:
添加头文件:
修改lv_port_disp_init()函数
笔者屏幕情况及上面所选缓冲区大小:
static lv_color_t buf_1[X* Y];
lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, X* Y);
X为你屏幕的宽度,Y最小值为10。
修改lv_port_disp_init()函数最后要修改的地方:
LVGL初始化函数和填充函数修改,在相应的地方加入你的函数:
大坑一:除非你不会写自己的填充函数,或你的lcd.c没有,不然不要使用法一,不然你的LCD显示就像拉窗帘一样,来刷新屏幕。
读者可以参考笔者的填充函数:
/*
* 名字:LCD色块填充函数
* 功能:进行色块填充
* 参数sx:色块填充的开始x坐标
* 参数sy:色块填充的开始y坐标
* 参数ex:色块填充的结束x坐标
* 参数ey:色块填充的结束y坐标
* 参数color:要填充的颜色指针
* 返回值:无
*/
void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16* color)
{
u16 height, width;
width = ex - sx + 1;
height = ey - sy + 1;
//设置显示窗口大小
LCD_SetWindows(sx,sy,ex,ey);
for(uint32_t y = 0; y <width*height; y++)
{
Lcd_WriteData_16Bit(*color);
color++;
}
}
到此显示部分移植完成。
五,触摸部分移植
添加头文件及相关变量,如果你配置正确你的第7行应该和我一样:
将触摸无关的删掉,剪裁后如下:
/**
* @file lv_port_indev_templ.c
*
*/
/*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/
#if 1
/*********************
* INCLUDES
*********************/
#include "lv_port_indev_template.h"
#include "../../lvgl.h"
#include "touch.h"
/*********************
* DEFINES
*********************/
/* 触摸坐标存储数组 */
int getX_Y[ 2 ];
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
static void touchpad_init(void);
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static bool touchpad_is_pressed(void);
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);
/**********************
* STATIC VARIABLES
**********************/
lv_indev_t * indev_touchpad;
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
void lv_port_indev_init(void)
{
static lv_indev_drv_t indev_drv;
/*------------------
* Touchpad
* -----------------*/
/*Initialize your touchpad if you have*/
touchpad_init();
/*Register a touchpad input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = touchpad_read;
indev_touchpad = lv_indev_drv_register(&indev_drv);
}
/**********************
* STATIC FUNCTIONS
**********************/
/*------------------
* Touchpad
* -----------------*/
/*Initialize your touchpad*/
static void touchpad_init(void)
{
/*Your code comes here*/
}
/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static lv_coord_t last_x = 0;
static lv_coord_t last_y = 0;
/*Save the pressed coordinates and the state*/
if(touchpad_is_pressed()) {
touchpad_get_xy(&last_x, &last_y);
data->state = LV_INDEV_STATE_PR;
} else {
data->state = LV_INDEV_STATE_REL;
}
/*Set the last pressed coordinates*/
data->point.x = last_x;
data->point.y = last_y;
}
/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
/*Your code comes here*/
return false;
}
/*Get the x and y coordinates if the touchpad is pressed*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
/*Your code comes here*/
}
#else /*Enable this file at the top*/
/*This dummy typedef exists purely to silence -Wpedantic.*/
typedef int keep_pedantic_happy;
#endif
修改LVGL的触摸初始化函数(笔者的触摸初始化已经在cubemx配置时实现了,读者有触摸初始化函数放入在这即可):
修改LVGL触摸检测函数:
修改LVGL 获取坐标函数:
至此触摸配置完成。
六,进行lvgl.h配置
修改色深(笔者屏幕为16色的):
修改缓冲大小,内存不够可以将这里改小一些:
修改点击灵敏度(这里笔者改为15ms):
七,实验
画一个标签:
如果在中间显示Label及移植成功,如果你这里显示一堆错误很有可能是内存不够。
此时你在添加这行代码lv_switch_create( lv_scr_act() );显示一个滑块,可能会出现意想不到的错误。如:运行卡在硬件错误句柄这里。
你需要打开你芯片的改.s文件,将 Stack_Size EQU 0x400改为如下