【LVGL学习手札】(1)VSCode+GuiGuider搞定UI设计与调试

文章介绍了如何使用LVGL图形库配合GuiGuider在VSCode环境下进行UI设计与调试。通过GuiGuider的拖拽式编辑器创建UI,然后在VSCode中配置CMakeList文件,实现与GuiGuider的结合,从而进行代码调试。作者提供了环境准备、开发流程及步骤,包括创建UI工程、编写事务代码、调试和移植到目标平台的过程。此外,还提供了一个简单的按钮计数器例子来展示使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Alt

LVGL学习手札

(1)VSCode+GuiGuider搞定UI设计与调试

笔者:Coolouba Alt

根植开源,学无止境

1、引子

LVGLLight and Versatile Graphics Library

LVGL is the most popular free and open-source embedded graphics library to create beautiful UIs for any MCU, MPU and display type.

LVGL是最受欢迎的免费开源嵌入式图形库,可为任何MCU、MPU和显示器类型创建漂亮的UI。

GuiGuider

GUI Guider是恩智浦提供的用户友好型图形用户界面开发工具,可通过开源LVGL图形库快速开发高品质的显示。GUI Guider的拖放编辑器可以轻松利用LVGL的众多特性,如小部件、动画和样式来创建GUI,而只需少量代码或根本无需任何代码。

在这里插入图片描述

VSCode

大名鼎鼎,无需多言。

在这里插入图片描述

通过GuiGuider可以很方便的进行拖拽式UI设计,工程架构主要包括了界面代码(generated文件夹)和事务代码(custom文件夹),移植到最后的目标平台非常方便,是LVGL辅助开发利器。
GuiGuider自带模拟器,可以脱离目标平台完成先期开发工作,提高效率;然而并 未集成调试功能 ,事务代码开发调试困难。
还好,LVGL官方支持VSCode下的仿真环境,经过一小番折腾,配置好了CMakeList文件,顺利将GuiGuider与VSCode结合,实现UI设计与仿真调试。笔者完成的工作只是将GuiGuider和VSCode结合,方便UI设计与事务代码调试穿插迭代。
当然,LVGL在PC端的仿真环境包括多种,理论上均可实现类似需求(也有可能有大佬已经用上了更便捷的方法),不中意VSCode的同学也可参考笔者的思路尝试匹配自己喜欢IDE:

LVGL Simulator on PC

  • Eclipse with SDL driver: Recommended on Linux and Mac
  • CodeBlocks: Recommended on Windows
  • VisualStudio: with SDL driver: For Windows
  • VSCode with SDL driver: Recommended on Linux and Mac
  • PlatformIO with SDL driver: Recommended on Linux and Mac

2、环境准备

VSCode

安装VSCode软件,参考Windows环境下模拟LittlevGL,配置好LVGL在VSCode下的运行环境

笔者验证时使用版本

  • VSCode: 1.77.3
  • GCC: 12.2.8
GuiGuider

下载并安装GuiGuider

笔者验证时使用版本:1.5.1-GA

LVGL_GuiGuider_V8_SimEnv

下载并解压LVGL_GuiGuider_V8_VSCodeSimEnv

3、开发流程及使用步骤

开发流程主要包括三个部分:创建可调试UI工程、事务代码调试、迭代,大抵如下:

YES
NO
创建UI工程GuiGuider
拷贝仿真文件夹LVGL_GuiGuider_V8_SimEnv
编写事务代码VSCode
调试事务代码VSCode
迭代UI设计GuiGuider
完成开发?
移植目标平台

4、一个小例子

使用一个小例子介绍使用方法:

  • UI为一个按钮和一个文本标签
  • 按钮处理计数值,文本标签显示计数值
  • 单击按钮计数值加一,长按按钮计数值自减。
GuiGuider创建UI工程

打开GuiGuider软件,点击 创建新项目
在这里插入图片描述

选择LVGL版本(请选择V8版本
在这里插入图片描述

选择Simulator
在这里插入图片描述

选择EmptyUI,创建空工程
在这里插入图片描述

填写工程保存路径及工程名称,以及分辨率等其它信息;
在这里插入图片描述

创建完成后会在工程保存路径下生成一个与工程名同名的文件夹
在这里插入图片描述

编辑UI,生成代码

点击控件工具栏中按钮控件 Button 和文本标签控件 label,在UI上会生成一个按钮 btn_1 和一个文本标签 label_1
在这里插入图片描述

点击 生成代码 或者 模拟器(C) ,生成代码,代码主要包括:

  • custom文件夹: 用户事务代码入口,每次更新工程不会覆盖
  • generated文件夹: UI代码,每次更新工程都会覆盖重写

后期目标平台移植也主要使用这两个文件夹内容。

拷贝仿真环境文件

将仿真环境文件夹 LVGL_GuiGuider_V8_SimEnv 下所有内容拷贝到生成的工程文件夹下(本例为 ButtonCounter
在这里插入图片描述

VSCode打开工程文件夹

工程文件夹右键,VSCode打开;或者打开VSCode后,File->Open Folder ,选择工程文件夹。
在这里插入图片描述
在这里插入图片描述

打开工程后,VSCode顶部会弹出提示,选择GCC编译器
在这里插入图片描述

如果未弹出提示或因为其它操作提示框消除,可点击VSCode左下状态栏中 No Kit Selected 再次选择
在这里插入图片描述

状态栏主要的操作图标(图中黄色框标记)依次是 编译全部配置Debug运行 ;当文件修改后,重新编译、Debug或者运行都将自动开始编译。在build文件夹中有缓存文件CMakeCache.txt记录上次编译情况,针对代码变化情况增量编译,因此第一次编译时间较长,后续调试时编译很快。

点击 运行 按钮,待编译完成后,正常情况下就会出现刚才设计的界面:
在这里插入图片描述

这个时候点击按钮是没有任何功能的,需要添加事务代码,实现按钮计数的功能。

编写事务代码并调试

custom.c中添加按键回调函数btn_cb,在custom_init函数中添加回调函数绑定代码。

   //按键回调函数
   static void btn_cb(lv_event_t* e)
   {
      static int cnt = 0; //静态计数值
      lv_event_code_t code = lv_event_get_code(e);    //获取按键值
      switch (code)
      {
      case LV_EVENT_SHORT_CLICKED:    //单击加计数
         cnt++;  
         break;
      case LV_EVENT_LONG_PRESSED:
      case LV_EVENT_LONG_PRESSED_REPEAT:  //长按减计数
         cnt--;
         break;
      default:
         break;
      }
      lv_label_set_text_fmt(guider_ui.screen_label_1, "%d", cnt); //设置文本标签
   }

   void custom_init(lv_ui *ui)
   {
      /* Add your codes here */
      lv_obj_add_event_cb(guider_ui.screen_btn_1, btn_cb, LV_EVENT_ALL, NULL);    //绑定回调函数
   }

再次点击 运行 按钮,新生成的界面就具备交互功能
在这里插入图片描述

btn_cb 函数中,行号左侧单击,添加断点(小红点),点击 Debug 按钮,进入调试模式,生成的界面里点击按钮,进入断点,此时可以单步运行、查看变量等
在这里插入图片描述

开发迭代

现在增加一个功能:

显示按键状态

GuiGuider打开ButtonCounter工程,UI添加一个新文本标签 label_2
在这里插入图片描述

设置标签背景颜色白色、字体黑色、左对齐
在这里插入图片描述

点击快捷工具栏中 生成代码 ,更新UI代码
回到VSCode,在custom.c中增加label_2相关代码(行号10、行号14

//按键回调函数
static void btn_cb(lv_event_t* e)
{
    static int cnt = 0; //静态计数值
    lv_event_code_t code = lv_event_get_code(e);    //获取按键值
    switch (code)
    {
    case LV_EVENT_SHORT_CLICKED:    //单击加计数
        cnt++;  
        lv_label_set_text_fmt(guider_ui.screen_label_2, "Button Status: %s","CLICKED"); //设置文本标签
        break;
    case LV_EVENT_LONG_PRESSED:
    case LV_EVENT_LONG_PRESSED_REPEAT:  //长按减计数
        lv_label_set_text_fmt(guider_ui.screen_label_2, "Button Status: %s", "LONG PRESSED"); //设置文本标签
        cnt--;
        break;
    default:
        break;
    }
    lv_label_set_text_fmt(guider_ui.screen_label_1, "%d", cnt); //设置文本标签
}

void custom_init(lv_ui *ui)
{
    /* Add your codes here */
    lv_obj_add_event_cb(guider_ui.screen_btn_1, btn_cb, LV_EVENT_ALL, NULL);    //绑定回调函数
}

点击 运行 按钮,点击按钮,显示按键状态
在这里插入图片描述

5、Tips

  • 缓存:
  1. 工程更换路径后,编译时提示错误,路径与缓存路径不一致,可删除 build 文件夹下CMakeCache.txt文件重新编译
  2. 出现缓存无法载入错误,可以删除 build 文件夹,重新拷贝 LVGL_GuiGuider_V8_SimEnv/build 文件夹
  • 输出文件权限:
    若未关闭程序界面,点击 Debug 或者 运行,会提示输出文件权限错误: 在这里插入图片描述

  • LVGL版本: 当前只支持V8版本,测试时为V8.3.2

  • 生成代码: 迭代UI后,需要重新生成代码以更新

6、参考与鸣谢

最后,笔者精力有限,未能作太多工程测试,可能有未趟到的坑,可留言告知,一同完善;若有V7版本需求,也可共同努力实现O(∩_∩)O

【RT-Thread作品秀】基于 lvgl 的漏电保护装置校验仪 UI 界面设计作者:赵加文 概述低压漏电引起的各种安全事故已经严重影响到生产生活,威胁到生命财产安全。而解决这一现象的设备就是漏电保护开关,漏电保护开关的漏报率、误报率是很关键的参数,因此有必要对漏电保护开关的性能进行测试。因此,漏电保护装置校验仪是很有必要的。 开发环境硬件:ART-Pi 开发板,正点原子 480*272 4.3寸 RGB 屏幕 RT-Thread版本:4.0.3 开发工具及版本: RT-Thread Studio 2.0.0 :编写 编译 调试 下载代码 STM32CubeMX 6.1.0: codeBlocks 20.03:用于在 PC 机上进行 lvgl 模拟 MCU_Font V2.0: 用于转换中文,然后使得中文能够在 lvgl 中显示 RT-Thread使用情况概述在 UI 设计的整个过程中,使用到 RT-Thread 的部分主要有以下几个方面: 内核部分:动态线程,信号量 组件部分:PIN 设备、I2C 设备、TOUCH 设备框架、LCD 设备框架、finsh 组件 软件包部分:littlevgl2rtt、gt9147 硬件框架软件框架说明系统整体流程图: 软件模块说明整个UI 系统设计所遵循的是 lvgl 图形库的一个回调函数的机制,将各个事件对应的操作所绑定起来,当滑动滑条时对应的滑条的回调函数就会被触发,那么就会执行滑条回调函数的内容,当滑动点击文本框时,文本框对应的回调函数就会被触发,进而创建键盘的控件,通过键盘输入所需要的数据。 演示效果图片展示: 演示视频: 比赛感悟这次参赛,之前还没有使用过 RT-Thread studio 这个集成开发环境,这次在使用 ART-Pi 的时候全程是使用 RT-Thread studio 这个开发环境,在使用的过程中也碰到了很多问题,有时候明明配置了相关组件,但是保存之后,并没有代码添加到工程里。现在也没有弄明白问题出在哪里,虽然存在着这里问题,但是在使用的过程中,还是非常的方便,整个开发过程就如同搭积木一样方便, RTT操作系统贴合的非常的紧密。 除此之外,便是在使用 lvgl 的过程中碰到了很多的问题,现在网上的教程基本是 lvgl v6 版本的教程,关于 lvgl v7 版本的教程很少,而且 v6版本 V7 版本的 API 相差很大,不能按照 V6 版本来使用 V7 ,在这个过程中摸索了好多,同时也感受到了 lvgl 的魅力,使用在嵌入式系统上是非常不错的选择。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值