本帖最后由 [鑫森淼焱垚] 于 2024-5-25 15:04 编辑
【APM32F411V Tiny Board测评】移植 LVGL
LVGL 介绍
移植
复制文件
新建工程
添加源文件
添加移植文件
移植文件 lv_port_disp.c
移植结果
|
LVGL 介绍
LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。
主要特性
- 强大的构建块,如按钮,图表,列表,滑块,图像等。
- 高级图形动画,抗锯齿,不透明度,平滑滚动
- 各种输入设备,如触摸板、鼠标、键盘、编码器等
- 多语言支持与UTF-8编码
- 多显示器支持,即使用更多的TFT,单色显示器同时
- 完全可定制的图形元素与css类样式
- 硬件独立与任何微控制器或显示器使用
- 可扩展,使用少量内存(64kb Flash, 16kb RAM)
- 支持操作系统、外部内存和GPU,但不是必需的
- 单帧缓冲操作,甚至与高级图形效果
- 用C编写的最大兼容性(c++兼容)
- 模拟器在没有嵌入式硬件的PC上开始嵌入式GUI设计
- 绑定到MicroPython
- 教程,例子,快速GUI设计的主题
- 文档可以在线和PDF格式获取
- 麻省理工学院许可下的免费和开源
移植
复制文件
从 github 下载 lvgl_v8.3.11 版本,存放到我的示例工程中,这里放在 MiddleWares 目录下。
新建工程
复制上一个帖子的工程,重命名为 baremetal_lvgl 工程,打开SDK并更改目标名字为 baremetal_lvgl,并且在工程配置选项中修改输出文件名为 baremetal_lvgl。
添加源文件
新建如下分区,分别添加对应的文件:
- lvgl/src,添加 lvgl/src 目录下包含子目录中的所有源文件;
- lvgl/examples,添加 lvgl/examples 目录下包含子目录中的所有源文件,但是不包含 porting 目录;
- lvgl/demos/benchmark,添加 lvgl/demos/benchmark 目录下包含子目录中的所有源文件;
- lvgl/demos/keypad_encoder,添加 lvgl/demos/keypad_encoder 目录下包含子目录中的所有源文件;
- lvgl/demos/music,添加 lvgl/demos/music 目录下包含子目录中的所有源文件;
- lvgl/demos/stress,添加 lvgl/demos/stress 目录下包含子目录中的所有源文件;
- lvgl/demos/widgets,添加 lvgl/demos/widgets 目录下包含子目录中的所有源文件;
添加移植文件
在 Boards 目录下新建 LVGL_PORT 目录,拷贝 lvgl_v8.3.11/examples/porting 目录下的lv_port_disp_template.c/h 两个文件到 LVGL_PORT 目录,并修改文件名为 lv_port_disp.c/h。
修改 lv_port_disp.c 源文件,并把第12行修改为 #include "lv_port_disp.h", 如下
同样修改 lv_port_disp.h 文件,使能这个文件。
从 lvgl_v8.3.11 拷贝 lv_conf_template.h 到工程的头文件路径中,并修改名字为 lv_conf.h ,并修改第15行为 #if 1,如下图所示:
Keil MDK 工程中新建 lvgl/port 分组,并加入上面的源文件。
打开 Keil MDK 工程选项,增加两个宏定义 LV_LVGL_H_INCLUDE_SIMPLE 和 LV_CONF_INCLUDE_SIMPLE,
打开 Keil MDK 工程选项,增加头文件路径,添加 lvgl 相关的两个头文件路径,如下
移植文件 lv_port_disp.c
第一步,在此文件中定义屏幕尺寸,新增加两个宏定义,如下所示:
第二步,函数 disp_init() 中选中一种缓冲形式,这里使用第一种,屏蔽下面两种:
第三步,在 disp_flush() 函数中调用刷屏函数,把数据刷到显示屏上。
在合适的时机调用 lv_tick_inc(1)
LVGL 可以在裸机上运行,也可以在RTOS上运行,这里以裸机为例,在滴答中断中调用 lv_tick_inc(1) 每隔一毫秒调用一次。
启动 lvgl 运行示例
这里以裸机为例,在 main() 函数中初始化硬件资源之后调用 lv_init() 初始化 LVGL 内核,调用 lv_port_disp_init() 初始化显示接口,调用 lv_example_anim_2() 运行示例。
最后还需要再死循环中周期性调用 lv_task_handler()。因为 LVGL 内核中用定时器来推动GUI刷新,这里只是前台。
移植结果
我分别已知了Baremetal 和 FreeRTOS 版本。编译优化等级开到最大,还是运行不流畅,勉强能用。
B站视频:https://www.bilibili.com/video/BV1dM4m1k7F9/?vd_source=8f2bbf56b70c541bec2ea0b9f102ebee
|