打印
[活动]

【APM32F411V Tiny Board测评】移植 LVGL

[复制链接]
176|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 [鑫森淼焱垚] 于 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








使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

75

帖子

0

粉丝