为什么最终选择了 LVGL?
经过比较多种主流的界面设计软件,emWin 开发方便 ,但是没有开放源码 ,之前没用过, 不过GD32 和emWin 有合作,官方推荐这个;
TouchGFX目前仅限于STM32用, 应用范围小;
ThreadX 的配套GUI GUIX 这个用起来感觉确实很方便,其实很想用, 但是由于对ThreadX还不太熟悉,所以GD32移植ThreadX还是有点麻烦,所以暂时放弃,但是 不得不说ThreadX 系统的性能还是很厉害的,它的中断响应速度在目前流行的多数嵌入式系统中是数一数二的,
国产的周立功也推出了GUI界面库以及配套设计,AWTK全称为Toolkit AnyWhere,是周立功倾心打造的一套基于C语言开发的GUI框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的GUI引擎。其特点是支持跨平台同步开发,一次编程,到处编译,跨平台使用。但是目前感觉用的人不多,根据官方介绍 ,对系统资源也是有些要求的,
QT for MCU 对资源受限的单片机来说 还是不太流畅
GuiLite 是简单,易学的GUI库,代码量少,例子很多, 但是没有图形化设计软件;
所以最终综合考虑 ,LVGL 可以在多平台运行, 也有图形化设计软件,就选择了它,不过LVGL 目前对GD32的硬件加速没有什么支持,各种图像处理都在使用CPU ,这个面对动态复杂画面就不太合适了
2024-09-10补充:
最近我测试了STM32H7RS 系列的芯片,也跑了LVGL, 抑制了经典Demo,
发现LVGL的一些问题, 就是这个UI库 比较吃CPU资源, 在动态画面或者辅助画面的适合就比较明显
绝大多数高端单片机的GPU它还不支持,目前支持的GPU仅有 NXP 和 renesas 的, 使用涉及到图像处理时 大部分情况都得靠CPU,这回导致系统性能下降,而且LVGLV8的 图像刷新处理机制采用的是阻塞方式,所以就算使用了硬件加速单元也不能很好的让出CPU资源。
所以LVGL 适合简单的静态界面设计,不适合 持续动态画面 以及 拖动或滚动的设计
移植LVGL 基本的思路是
1使用GUI Guider 设计好LVGL的界面, 这个软件是 NXP官方为自家芯片的图形化界面设计而推出的, 也支持PC端模拟设计, 可以生成lvgl图形的源码;
2创建目标板的工程,调试好液晶屏的驱动程序 RGB,SPI等任何接口都可以
3界面移植工作
1)移植LVGL 源码,不包含设计的GUI界面;(先把文件加入工程中)
2)移植GUI Guider生成的界面代码(先把文件加入工程中)
3)对LVGL界面库的代码进行配置,主要是修改一些头文件里的 宏定义(修改文h件)
4)对GUI Guider的代码移植后 要在主函数中进行 配置和调用 (修改c文件)
5) 有时候要根据GUI Guider界面所用到的控件和资源 对 LVGL的配置文件进行二次调整
移植时注意 建议尽量按照官方指导的文件结构去移植,
GD32H7 移植要点
1 搞明白TLI的用法。
TLI实际上是rgb接口液晶屏的控制器,除了要定义基本的rgb接口输出时要设置参数之外。
里面有两个图层控制单元,图层0和图层1可以进行简单的图层混合操作。
在使用时可以使用一个图层,也可以使用两个图层。但是即使不用的图层也会参与到后期的2个图层的混合过程中,最后输出混合的图像。不使用的图层可以设置一个默认的图层参数。图层没有使用时,这个默认参数就会被激活。
TLI的工作过程是将 初始化时指定的显存区域的 图像内容 输出到GRB接口上。
暂时先用一个图层。
2移植 LVGL 的要点
1 .定义显存,定义显存位置,因为这个板子的屏幕也不小。,所以就算是单个整屏显存也要占用250kb左右的大小。使用双显存的话,需要将显存的位置定义在外部的任务中。
将显存定义在外部任务中有几种方式。
1) 不使用自定义sct文件,在Keil的工程中配置好外部显存的地址。然后在代码中指定分配地址,或者在代码属性中设置分配地址
2)使用自定义的sct文件, 在代码中指定 显存的位置
如 Arm V6下 :
先在sct中定义 SDRAM 的分配区,然后再代码中定义:
__ALIGNED(32) lv_color_t buf_disp[LV_HOR_RES_MAX * LV_VER_RES_MAX] __attribute__((section("SDRAM")));
2 .实现刷屏函数
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
这个的函数实现 是lvgl的一个重点,涉及到系统工作效率
方式1 内存到内存 想 准备好的显示内容 逐个字节搬运至 指定的TLI显存地址中
方式2 使用IPA的DMA
方式3 使用DMA-DMA