当前位置: 首页 > 工具软件 > LittlevGL > 使用案例 >

【LittleVGL】移植LittleVGL-V7

朱保赫
2023-12-01

虽然是转载,但其实也是本人的帖子。

(一)LittleVGL-V7

LittleVGL最新已经更新到V7系列,上一篇帖子 LPC54628 UI开发 3-littlvgl 介绍的是NXP官方MCUXpresso SDK 中移植好的LittleVGL,这个版本比较老,很多特性没有,界面也不够酷炫。而原子最近更新的 LittleVGL 教程则是基于V6版本的,基本上搬过来全是报错,无法参考,因此想要移植最新版本
 
当然最最新的版本是V7.3.0,可以从wiki页面看到,但我还没找到V7.3.0的源码,wiki页面release的也是V7.1.0。
 

(二)资料

源码:
github(由于M国对开源糟糕的态度,暂时无法直接登上去):https://github.com/lvgl/lvgl
gitee(我看了下跟github进度是一样的):https://gitee.com/mirrors/lvgl?_from=gitee_search
WIKI(里面有API手册下载地址):https://docs.lvgl.io/v7/en/html/
手册下载地址:https://docs.lvgl.io/v7/en/html/_downloads/39cea4971f327964c804e4e6bc96bfb4/LVGL.pdf
上传一份V7.1.0的API手册备份:
[attach]489165[/attach]
中文网站(基本没用,只用于宣传,没有建设好,点啥都是进那个页面):https://littlevgl.cn/
 

(三)移植

过程并不复杂:
1-把原本的littlevgl文件夹删掉,把Git下来的src里面的文件全部拷进去
2-替换掉source下面的lv_config.h,并进行一些基本配置,比如
设置纵宽像素:
#define LV_HOR_RES_MAX (LCD_WIDTH)
#define LV_VER_RES_MAX (LCD_HEIGHT)

 

设置开辟内存的宏定义:

/* 1: use custom malloc/free, 0: use the built-in `lv_mem_alloc` and `lv_mem_free` */
#define LV_MEM_CUSTOM 1
#if LV_MEM_CUSTOM == 0
/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
# define LV_MEM_SIZE (32U * 1024U)

/* Complier prefix for a big array declaration */
# define LV_MEM_ATTR

/* Set an address for the memory pool instead of allocating it as an array.
* Can be in external SRAM too. */
# define LV_MEM_ADR 0

/* Automatically defrag. on free. Defrag. means joining the adjacent free cells. */
# define LV_MEM_AUTO_DEFRAG 1
#else /*LV_MEM_CUSTOM*/
# define LV_MEM_CUSTOM_INCLUDE "FreeRTOS.h" /*Header for the dynamic memory function*/
# define LV_MEM_CUSTOM_ALLOC pvPortMalloc /*Wrapper to malloc*/
# define LV_MEM_CUSTOM_FREE vPortFree /*Wrapper to free*/
#endif /*LV_MEM_CUSTOM*/

 

把GPU禁用掉:

/* 1: Enable GPU interface*/
#define LV_USE_GPU 0 /*Only enables `gpu_fill_cb` and `gpu_blend_cb` in the disp. drv- */
#define LV_USE_GPU_STM32_DMA2D 0
/*If enabling LV_USE_GPU_STM32_DMA2D, LV_GPU_DMA2D_CMSIS_INCLUDE must be defined to include path of CMSIS header of target processor
e.g. "stm32f769xx.h" or "stm32f429xx.h" */
#define LV_GPU_DMA2D_CMSIS_INCLUDE

 

其他可以继续探究,还能修改为深夜模式呢!

 

3-在AppTask里面(一个freertos的用户定义任务)添加自己UI
这里不贴代码了,有兴趣看我后面的gitee链接
 
4-修改littlevgl_support.c
主要是lv_port_disp_init、lv_port_indev_init及其回调函数,至于lv_port_pre_init就不要再调用了,详见我的工程分享
lv_port_disp_init:
void lv_port_disp_init(void)
{
/*-------------------------
* Initialize your display
* -----------------------*/
DEMO_InitLcd();

/*-----------------------------------
* Register the display in LittlevGL
*----------------------------------*/

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*/
static lv_disp_buf_t disp_buf;
memset((void *)DEMO_BUFFER0_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL*2);
memset((void *)DEMO_BUFFER1_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL*2);
lv_disp_buf_init(&disp_buf, DEMO_BUFFER0_ADDR, DEMO_BUFFER1_ADDR, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL);
disp_drv.buffer = &disp_buf;

disp_drv.hor_res = LCD_WIDTH;
disp_drv.ver_res = LCD_HEIGHT;

/*Used in buffered mode (LV_VDB_SIZE != 0 in lv_conf.h)*/
disp_drv.flush_cb = DEMO_FlushDisplay;

/*Finally register the driver*/
lv_disp_drv_register(&disp_drv);
}

 

其中的 DEMO_FlushDisplay 也要改一下声明:

static void DEMO_FlushDisplay(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)

 

lv_port_indev_init:
void lv_port_indev_init(void)
{
lv_indev_drv_t indev_drv;

/*------------------
* Touchpad
* -----------------*/

/*Initialize your touchpad */
DEMO_InitTouch();

/*Register a touchpad input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = DEMO_ReadTouch;
lv_indev_drv_register(&indev_drv);
}

 

 

(四)PC仿真

1-PC仿真就更简单了,原子建议用code那个啥,不过我建议用Qt,因为有现成工程可用:
http://www.openedv.com/thread-312875-1-1.html
 
2-除了下载这个工程,还要下载SDL2,这个在Ubuntu下就是apt的事,windows下比较麻烦:
https://my.oschina.net/u/580100/blog/613760
总之就是进入http://www.libsdl.org/
下个 http://SDL2-devel-2.0.12-mingw.tar.gz (MinGW 32/64-bit)
应该大家的Qt都是用mingw的吧,不会有另辟蹊径用微软那套吧……
 
3-然后一般都是64位的,那就需要再改一下
把x86_64-w64-mingw32下面的lib、include靠到仿真工程的目录下,代替原本的lib、include
 
4-编译运行之后你会发现没有界面出来
不要慌
x86_64-w64-mingw32下面还有个bin文件夹,把SDL2.dll拷到Qt编译出来的二进制文件放置的文件夹下,譬如:
build-Lvgl_Simulator-Desktop_Qt_5_12_0_MinGW_64_bit-Debug\debug
再运行就有了
 

(五)工程

记得切换到V7分支,master分支还是V5版本的
工程分享:https://gitee.com/tinnu/EXC_Sreen_LittelVGL_LPC54628.git
 类似资料: