1.获取LVGL源码
先拉取一份LVGL8.2的源代码,并且准备一个完整的STM32工程,工程需要做好LCD驱动和定时器中断(这个可选)。
2.开始在文件夹移植:
在stm32工程目录里面创建一个LVGL文件夹,并且将LVGL源码的src、example/porting这两个文件夹以及lv_conf_template.h和lvgl.h复制到创建文件夹中。
创建完后是下面这样的。
去掉文件里面所有template后缀,不多就几个文件。
3.开始移植到工程
打开keil添加两个组,两个组取名看自己习惯
然后开始最麻烦的步骤,将src和porting还有lv_conf.h和lvgl.h添加到两个组。一个都不要落下包括GPU那个文件夹。
4.开始修改代码
将lv_conf.g ,lv_port_disp.c和lv_port_disp.h中的if 0 改成if 1
在lv_port_disp.c中选择三个模式中的一种,其他俩注释掉即可。
同时需要设置好自己的屏幕分辨率。
重点来了开始对对接函数了。当然有的教程会将屏幕初始化函数也对接进去,我没有因为我在移植之前就已经将屏幕正常驱动起来了所以就已经初始化了不必在到lvgl中初始化第二次。所以直接到绘制函数对接了。
对接显示绘制函数一般有两种,一种是将写好的画点函数填入其中,这种显示会比较慢。第二种就是对接区域填充函数即可,这种相对于第一种更加快。
第二种对接的时候遇到问题了,使用中景园的代码发现会不正常显示会出现条纹。我在网上发现解决办法就是重写专为LVGL写的显示函数。
当然我们需要#include "lvgl.h",不然等会会报错lv_color_t *未定义。
/******************************************************************************
函数说明:在指定区域填充颜色(LVGL专用区域填充函数)
入口数据:SX,SY 起始坐标
EX,EY 终止坐标
color 要填充的颜色
返回值: 无
******************************************************************************/
void lvgl_LCD_Color_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, lv_color_t *color)
{
uint32_t y=0;
uint16_t height, width;
width = ex - sx + 1; //得到填充的宽度
height = ey - sy + 1; //高度
LCD_Address_Set(sx,sy,ex,ey);//设置显示范围
for(y = 0; y <width*height; y++)
{
LCD_WR_DATA(color->full);
color++;
}
}
5.在main函数里面开始调用LVGL的API开始设计了
我没有使用定时器中断来提供心跳,我直接在while(1)里面延时1ms来循环调用lv_tick_inc(1);函数来提供心跳。并且我们还需要调用lv_timer_handler()来使得LVGL正常运行。
最后开始编译代码,会报错很多,但是基本上都是#include“lvgl.h”这个出问题了,将#inclde"./././lvgl.h"这种改成#include“lvgl.h”就行了。要是还有其他报错就在网上看看有没有解决办法即可。只要不放弃就一定可以解决难题!!!
6.移植成功
到这里就差不多移植成功了,移植的过程肯定不会一帆风顺,遇到问题就解决问题不要害怕,多试一试没准就成功了呢!
7.开启内存使用显示以及帧率显示
这俩改为1即可显示,我这里屏幕很小就关闭了,大家开启了就会得到熟悉的LVGL界面了。