1、LVGL简介
LittlevGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用。
1.1、LVGL特点
- 强大的构建模组:按钮、图表、列表、滑块、图像等
- 先进的图形:动画、反锯齿、半透明、平滑滚动
- 多样的输入设备:触摸板、鼠标、键盘、编码器等
- 多显示器支持:支持同时使用多个TFT或单色显示器
- 多语言支持:格式文字编码
- 硬件无关:可用于任UTF-8意微控制器或显示器
- 可裁剪:用于小内存(64 KB FLASH,16 KB RAM)操作
- 外部支持:操作系统、外部存储以及GPU
- 单帧缓存:即可实现先进的图形效果
- C语言编写:以最大化兼容(C++ 兼容)
- 模拟器:无需嵌入式硬件就可以在电脑上开始GUI设计
- 文档:在线及离线
- 免费开源:基于MIT协议
1.2、LVGL硬件运行要求
名称 | 最小值 | 推荐值 |
Arch | >= 16位的微控制器或处理器 | |
Clock | > 16 MHz 时钟速度 | |
Flash/ROM | > 64 kB | > 180 kB |
Static RAM | ~2 kB,取决于使用的功能和对象类型 | |
Stack | > 2 kB | > 8 kB |
Heap | > 4 KB | > 32 kB |
Compiler | C99或以上 |
1.3、LVGL网址
- LVGL官网:LVGL - Light and Versatile Embedded Graphics Library
- LVGL代码库地址(Simulator、Source、Examples、Esp32、MicroPython):https://github.com/lvgl
- LVGL源码下载地址:https://github.com/lvgl/lvgl
2、LVGL源码下载
1. 在源码链接中下载一份源码,LVGL已经更新迭代了很多个版本,这里我们选择8.2.0版本来移植。
注意:不同版本之间有很大的不同,尽量使用与本文相同的版本,否则不予解释。
2. 下载后得到如下目录结构
3. 源码各文件作用
github:github的配置文件,忽略即可。
docs:说明文档。
examples:示例代码。
scripts:配置脚本,Linux平台会用到,Windows忽略即可。
src:源代码。
tests:测试代码。
4. LVGL移植需求
STM32工程,该工程应具备功能:
LCD显示(必备)
TOUCH触摸(可选)
内存管理(可选)
操作系统(可选)
注意:本示例中使用1.3寸SPI LCD,分辨率为240*240
3、LVGL移植过程
3.1、 添加源码
在工程目录下创建LVGL文件夹,以及src、port子文件夹,如下图所示
2.将LVGL的源码(lvgl-8.2.0\src)复制到本工程中的LVGL\src目录中
3.将LVGL的驱动接口文件(lvgl-8.2.0\examples\porting)复制到本工程中的LVGL\port文件夹中。
其中共六个文件:
disp为显示接口驱动文件(LCD),
fs为文件系统接口驱动文件(FATFS),
indev为输入设备接口驱动文件(TOUCH)。
4.将LVGL源码中的lv_conf_template.h更名为lv_conf.h,与lvgl.h一同拷贝到工程中的LVGL目录下
5.打开工程,在工程的目录结构中添加两个文件夹lvgl/src ,lvgl/port
注意:添加.h和.c文件时要注意将所有文件添加,如果少添加或者添加错误会导致编译报很多错误
6.添加源码头文件路径
7.如果工程中没有内存管理,则需要修改启动文件中的堆栈。根据官方推荐我们可以把堆栈修改为4K,假如使用的功能比较多,还需要再适当增大。
8.LVGL的源码需要C99的支持,否则编译无法通过。
9.如果MCU支持编译器优化,可以开启该设置加速界面显示
3.2、更改接口文件
1.默认lv_port_disp_template.c和lv_port_disp_template.h的条件编译是关闭的,我们需要把他打开并修改包含目录层级。
修改lvgl.h头文件的位置
2.默认lv_conf.h的条件编译是关闭的,我们需要把他打开并修改包含目录层级。
定义硬件屏幕大小
还需要做如下修改:
在lv_port_disp_template.h中引入lv_conf.h
使用单缓冲区渲染,屏蔽不需要的缓冲区,替换屏幕大小宏
3.更改lvgl刷屏函数
添加屏幕设置头文件
更改刷屏函数
其它配置暂时默认即可,需要开启时在进行开启
4.在main.h头文件中添加lvgl.h、lv_conf.h、lv_port_disp_template.h文件
3.3、编译工程
3.4、显示实现
1.配置一个定时器为LVGL提供1ms的时钟心跳,该定时器的中断服务函数中调用lv_tick_inc(1);即可。
本例使用系统滴答定时器。
2.主程序中调用lv_task_handler();函数处理事件
Main.c
lvgl测试代码
// lvgl测试代码
lv_init();
lv_port_disp_init();
lv_obj_t* scrHome = NULL;
lv_obj_t * arc = NULL;
scrHome = lv_obj_create(NULL);
lv_obj_set_pos(scrHome, 0, 0);
lv_obj_set_size(scrHome,240,260);
arc = lv_arc_create(scrHome);
lv_arc_set_rotation(arc, 270);
lv_arc_set_bg_angles(arc, 0, 360);
lv_obj_remove_style(arc, NULL, LV_PART_KNOB); /*Be sure the knob is not displayed*/
lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE); /*To not allow adjusting by click*/
lv_obj_center(arc);
lv_scr_load(scrHome);
3.编译下载进入板子
屏幕上显示圆弧图案即为移植成功,也可以移植其他官网测试示例.