一.学习背景
LVGL是一款开源的嵌入式GUI框架。轻量级和灵活性是其著有的特征。我们在开发如智能手表,仪器表盘时可以采用这个框架。
二.移植LVGL
在移植之前我们要确保我们的硬件芯片符合移植的要求,以下表为标准:
Name | Minimal | Recommended |
---|---|---|
Architecture | 16, 32 or 64 bit microcontroller or processor | |
Clock | > 16 MHz | > 48 MHz |
Flash/ROM | > 64 kB | > 180 kB |
Static RAM | > 16 kB | > 48 kB |
Draw buffer | > 1 ×hor. res. pixels | > 1/10 screen size |
Compiler | C99 or newer |
首先,要在官方开源地址下下载LVGL的源文件。
作为初学者的话我们一般选择V8.3版本的,适用范围广,教程相对多。
下载解压后我们可以得到:
然后我们在另一个目录下新建一个文件夹,在这个文件夹中复制我们需要移植的一些文件,这里我们只需要以下文件夹:
同时我们将“lv_conf_template.h”改为“lv_conf.h”和以下地址中的文件后的“_template”也去掉。
更改后如下:
紧接着我们需要创建一个工程并将LVGL库文件移植进去我们的工程。这里以CubeMX创建的STM32F407VET6的工程为例。
我们向空工程的文件夹中添加“LVGL”文件夹,并向其中复制我们刚才改好的文件,如下:
完成以上之后我们就可以开始正式进入Keil配置工程项了,进入工程管理界面,添加以下文件组:
详细解释如下:
文件夹名称 (Groups) | 用于存放什么文件 |
LVGL_myGui | 用户自己的界面代码文件、官方demo等 |
LVGL_conf | LVGL 的两个h文件 |
LVGL_porting | LVGL 的接口文件, 如显示、触摸屏、键盘等 |
LVGL_src | LVGL 的所有底层c文件 |
完成后最好编译一下以免有错误。
注意以下为最重要的步骤,向刚才创建的工程组中分别添加文件,具体如下:
组 | 文件 |
---|---|
LVGL_myGUI | 个人文件,暂不需添加。 |
LVGL_conf | LVGL根目录中的lv_conf.h、lvgl.h |
LVGL_porting | LVGL/ examples / porting中的“lv_port_disp.c 、lv_port_disp.h、 lv_port_indev.c、lv_port_indev.h” |
LVGL_src | LVGL/ src目录下的所有.c文件(注意:这里是所有.c文件,包括所有子目录下的和src根目录下的)(笔者数了一下,大概是201个,读者可自己数一下) |
添加完以后如下(src未展示完全):
下一步,注意将C99勾选上
向头文件中添加这几个文件夹:
此时可以再编译一次,若没有错误则算成功。
接着要完成LVGL文件的注册,即开启:
1、开启 lv_conf.h
把“#if 0”改为“#if 1”
2、开启 lv_port_disp.h
改1
注意这里还要把"lvgl/lvgl.h"改为"lvgl.h"
3、开启 lv_port_disp.c
同样的,这里要删去“_template”
在lv_port_disp.c这个文件中,还需要选择一个缓冲方式,我们一般选第一种(大概在90到101行),故这里我们注释掉第二和第三种
/* Example for 1) */
static lv_disp_draw_buf_t draw_buf_dsc_1;
static lv_color_t buf_1[MY_DISP_HOR_RES * 10]; /*A buffer for 10 rows*/
lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10); /*Initialize the display buffer*/
//选择第一种缓冲方式,注释掉后两种
// /* Example for 2) */
// static lv_disp_draw_buf_t draw_buf_dsc_2;
// static lv_color_t buf_2_1[MY_DISP_HOR_RES * 10]; /*A buffer for 10 rows*/
// static lv_color_t buf_2_2[MY_DISP_HOR_RES * 10]; /*An other buffer for 10 rows*/
// lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 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[MY_DISP_HOR_RES * MY_DISP_VER_RES]; /*A screen sized buffer*/
// static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES]; /*Another screen sized buffer*/
// lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2,
// MY_DISP_VER_RES * LV_VER_RES_MAX); /*Initialize the display buffer*/
若有错误,感谢指正!