一、获取源码
1、获取lvgl源代码。
https://github.com/lvgl/lvgl/tree/release/v8.3

2、准备移植的资料。

3、可以选择官网地址查看具体的移植信息。
Set up a project — LVGL documentation

二、移植LVGL到2.8英寸LCD电阻屏工程的步骤
1、进入2.8英寸LCD电阻屏工程文件中。

2、创建一个LVGL文件夹。

3、源码工程文件的三个文件夹复制到自己工程文件中。
| 要复制的三个文件夹 |
| demos、examples、src |

4、源码工程文件的两个.h文件复制到自己工程文件中。
| lv_conf_template.h更名为lv_conf.h |
| lvgl.h |

5、修改源码文件中的examples\porting路径下的文件名。
| lv_port_disp_template.c | lv_port_disp.c |
| lv_port_disp_template.h | lv_port_disp.h |
| lv_port_fs_template.c | lv_port_fs.c |
| lv_port_fs_template.h | lv_port_fs.h |
| lv_port_indev_template.c | lv_port_indev.c |
| lv_port_indev_template.h | lv_port_indev.h |

6、给Keil工程添加工程文件。
首先创建多个Groups组:

接下来为每个组添加文件:
| Groups | 文件路径 |
| LVGL_CORE | LVGL\src\core |
| LVGL_DRAW | LVGL\src\draw LVGL\src\draw\子文件夹 |
| LVGL_EXTRA | LVGL\src\extra LVGL\src\extra\子文件夹 |
| LVGL_FONT | LVGL\src\font |
| LVGL_HAL | LVGL\src\hal |
| LVGL_MISC | LVGL\src\misc |
| LVGL_WIDGETS | LVGL\src\widgets |
| LVGL_PORTING | LVGL\examples\porting |
| LVGL_CONFIG | LVGL\lvgl.h LVGL\lvgl_conf.h |
| LVGL_DEMO_BENCHMARK | LVGL\demos\benchmark LVGL\demos\benchmark\子文件夹 |
| LVGL_DEMO_STRESS | LVGL\demos\stress |
| LVGL_DEMO_WIDGETS | LVGL\demos\widgets LVGL\demos\widgets\子文件夹 |
| LVGL_DEMO_KEYPAD | LVGL\demos\keypad_encoder |
(1)、LVGL\src\hal路径下的.c文件复制到LVGL_HAL组中。
(2)、LVGL\src\core路径下的.c文件复制到LVGL_CORE组中。

(3)、LVGL\src\draw和LVGL\src\draw\子文件夹路径下的.c文件复制到LVGL_DRAW组中。

(4)、LVGL\src\font路径下的.c文件复制到LVGL_FONT组中。

(5)、LVGL\src\misc路径下的.c文件复制到LVGL_MISC组中。

(6)、LVGL\src\widgets路径下的.c文件复制到LVGL_WIDGETS组中。

(7)、LVGL\examples\porting路径下的.c文件复制到LVGL_PORTING组中。

(8)、LVGL\lvgl.h和LVGL\lvgl_conf.h这两个.h文件复制到LVGL_CONFIG组中。

(9)、LVGL\demos\benchmark和LVGL\demos\benchmark\子文件夹路径下的.c文件复制到LVGL_DEMO_BENCHMARK组中。

(10)、LVGL\demos\stress路径下的.c文件复制到LVGL_DEMO_STRESS组中。

(11)、LVGL\demos\widgets和LVGL\demos\widgets\子文件夹路径下的.c文件复制到LVGL_DEMO_WIDGETS组中。

(12)、LVGL\demos\keypad_encoder路径下的.c文件复制到LVGL_DEMO_KEYPAD组中。

(13)、LVGL\src\extra和LVGL\src\extra\子文件夹路径下的.c文件复制到LVGL_EXTRA组中。

三、LVGL工程基础配置要点
1、在启动文件中检查栈的大小,至少为0x1000。

2、添加宏定义和选择模式。

设置原因:
(1)、宏LV_LVGL_H_INCLUDE_SIMPLE:不少文件存在以下的宏定义,所以添加这个宏是为了方便访问到lvgl.h头文件
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
(2)、C99 Mode:LVGL源码的编译需要C99模式的支持,不然会出现大量的报错。
3、给工程添加头文件包含。

四、LVGL相关文件信息
one-配置文件:LVGL\lv_conf.h
1、默认该文件是不参与编译,要将#if 0 修改为 #if 1。

2、根据当前显示设备支持的颜色深度设置宏LV_COLOR_DEPTH。
(1)、对于SPI TFT屏且每8位的传输,确定是否要交换16位色的高低字节,当前显示设备是高字节优先传输。
(2)、如果使能了DMA传输,要设置宏LV_COLOR_16_SWAP为1。

3、使能LV_USE_DEMO_WIDGETS,该demo验证显示效果。
#define LV_USE_DEMO_WIDGETS 1

two-显示设备:LVGL\examples\porting\lv_port_disp.c、LVGL\examples\porting\lv_port_disp.h
LVGL\examples\porting\lv_port_disp.h:
1、默认该文件是不参与编译,必须将#if 0 修改为 #if 1。

2、修改分辨率
根据用到的屏幕分辨率修改宏MY_DISP_HOR_RES(屏幕宽度)与MY_DISP_VER_RES(屏幕高度)。
/*********************
* DEFINES
*********************/
#ifndef MY_DISP_HOR_RES
#warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now.
#define MY_DISP_HOR_RES 320
#endif
#ifndef MY_DISP_VER_RES
#warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen height, default value 240 is used for now.
#define MY_DISP_VER_RES 240
#endif

LVGL\examples\porting\lv_port_disp.c:
1、.默认该文件是不参与编译,必须将#if 0 修改为 #if 1。

2、当前文件会涉及到显示设备的初始化、颜色填充等函数,需要引入相关支撑tft函数的头文件。

3、修改lv_port_disp_init函数
一、lv_port_disp_init函数介绍
lv_port_disp_init 函数是LVGL在特定平台或模拟器上初始化显示驱动的接口函数。在实际嵌入式项目中,需要根据硬件平台编写或修改这个函数来适配显示控制器。
lv_port_disp_init 函数的三个部分内容:
【1】初始化硬件:配置和打开与显示屏连接的硬件接口。(disp_init函数)
【2】创建显示器描述符:定义一个 lv_disp_drv_t 结构体实例,该结构体包含了LVGL需要的所有关于显示控制器的信息,例如:一个回调函数用于写像素数据到屏幕。(disp_flush函数)
【3】注册显示器驱动:调用 lv_disp_drv_register 函数,将创建好的显示器驱动结构体注册给LVGL核心库,使其能够通过该驱动与实际硬件进行通信。
二、LVGL缓冲区
LVGL需要使用缓冲区,用于在内部绘制小部件。此缓冲区将传递给显示器驱动程序的“flush_cb”(copy the buffer's content to the display),以将其内容复制到显示器,另外缓冲区必须大于1个显示行。
(1)创建一个行缓冲区(移植时使用该缓冲配置)
LVGL将在此处绘制显示器的内容,并将其写入显示器。
(2)创建两个行缓冲区(有DMA外设则使用该缓冲配置,能大幅提高显示帧率)
LVGL将绘制显示的内容到缓冲区并将其写入显示,并使用DMA将缓冲区的内容写入显示器,它将使LVGL绘制屏幕的下一部分到另一个缓冲区同时数据从第一个缓冲区发送。它使渲染和并行刷新。
(3)双重帧缓冲(有DMA且大内存则推荐使用该缓冲配置,进一步提高显示帧率)
设置2个屏幕大小的缓冲区,并设置disp_drv.full_refresh=1。这样,LVGL将始终在flush_cb中提供整个渲染屏幕,并且只需要更改帧缓冲区的地址。
三、编写函数
1、使用第一种缓冲配置,需注释掉Example for 2 与 Example for 3代码。


2、编写disp_init函数
该函数初始化显示器和所需的外围设备,并被lv_port_disp_init函数所调用。

/*Initialize your display and the required peripherals.*/
static void disp_init(void)
{
LCD_Init();
LCD_Display_Dir(0);
LCD_Scan_Dir(U2D_R2L);
lcddev.width=320;
lcddev.height=240;
}
3、disp_flush函数
将内部缓冲区的内容刷新到显示器上的特定区域,并被disp_drv.flush_cb进行回调。

/*Flush the content of the internal buffer the specific area on the display
*You can use DMA or any hardware acceleration to do this operation in the background but
*'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
int32_t x;
int32_t y;
if(disp_flush_enabled)
{
LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,(uint16_t *)color_p);
lv_disp_flush_ready(disp_drv);
}
}
three-输入设备:LVGL\examples\porting\lv_port_indev.c、LVGL\examples\porting\lv_port_indev.h
LVGL\examples\porting\lv_port_indev.h:
1、默认该文件是不参与编译,必须将#if 0 修改为 #if 1。

2、修改头文件#include "lvgl/lvgl.h"为#include "lvgl.h"

LVGL\examples\porting\lv_port_indev.c:
1、默认该文件是不参与编译,必须将#if 0 修改为 #if 1,另外增加以下头文件,支持触摸检测。

2、lv_port_indev_init函数中屏蔽鼠标、键盘、编码器等相关代码,只保留Touchpad(触摸板)设备。



3、touchpad_init函数
该函数会被lv_port_indev_init调用,并需增加初始化触摸板设备的代码。

/*Initialize your touchpad*/
static void touchpad_init(void)
{
/*Your code comes here*/
TP_Init();
}
4、touchpad_is_pressed函数
该函数会被touchpad_read调用,并需增加触摸板设备按压检测的代码。

/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
/*Your code comes here*/
if(PEN)
return false;
return true;
}
5、touchpad_get_xy函数
该函数会被touchpad_read调用,并需增加触摸板设备获取x、y坐标值的代码。

五、移植结束
自此LVGL的移植就结束了,你可以在项目中使用LVGL进行开发了!!!


8663

被折叠的 条评论
为什么被折叠?



