GD32入门到实战42--移植GUI库LVGL

发布于:2025-09-09 ⋅ 阅读:(22) ⋅ 点赞:(0)

我们在这个网站可以下载LVGL的源码

下载时我们要选择release(稳定)我这里用的LVGL V8.3

下载好打开

我们做一个工程模板吧

把之前LCD屏幕的一些文件删了

在工程文件夹里新建Mid_lvgl文件夹

把LVGL源码的src等文件夹复制到Mid_lvgl

修改一下第二个文件的文件名

继续拷贝....

按这个流程拷贝

添加文件

接下来我们要添加头文件路径,我这里准备了头文件的路径代码,在这里最后加";"再粘贴代码

.\App_Common;.\App_Modbus;.\Arm_Kernel;.\Drv_Common;.\Drv_Modbus;.\Gd32_Hal;.\Gd32_Hal\Include;.\Mid_Modbus;.\Mid_Modbus\rtu;.\Mid_Modbus\include;.\Mid_Lvgl;.\Mid_Lvgl\driver\porting;.\Mid_Lvgl\src;.\Mid_Lvgl\src\core;.\Mid_Lvgl\src\draw;.\Mid_Lvgl\src\extra;.\Mid_Lvgl\src\extra\layouts;.\Mid_Lvgl\src\extra\layouts\flex;.\Mid_Lvgl\src\extra\layouts\grid;.\Mid_Lvgl\src\extra\themes;.\Mid_Lvgl\src\extra\themes\basic;.\Mid_Lvgl\src\extra\themes\default;.\Mid_Lvgl\src\extra\themes\mono;.\Mid_Lvgl\src\extra\widgets;.\Mid_Lvgl\src\extra\widgets\animimg;.\Mid_Lvgl\src\extra\widgets\calendar;.\Mid_Lvgl\src\extra\widgets\chart;.\Mid_Lvgl\src\extra\widgets\colorwheel;.\Mid_Lvgl\src\extra\widgets\imgbtn;.\Mid_Lvgl\src\extra\widgets\keyboard;.\Mid_Lvgl\src\extra\widgets\led;.\Mid_Lvgl\src\extra\widgets\list;.\Mid_Lvgl\src\extra\widgets\menu;.\Mid_Lvgl\src\extra\widgets\meter;.\Mid_Lvgl\src\extra\widgets\msgbox;.\Mid_Lvgl\src\extra\widgets\span;.\Mid_Lvgl\src\extra\widgets\spinbox;.\Mid_Lvgl\src\extra\widgets\spinner;.\Mid_Lvgl\src\extra\widgets\tabview;.\Mid_Lvgl\src\extra\widgets\tileview;.\Mid_Lvgl\src\extra\widgets\win;.\Mid_Lvgl\src\font;.\Mid_Lvgl\src\hal;.\Mid_Lvgl\src\misc;.\Mid_Lvgl\src\widgets;.\App_Hmi\widgets;.\App_Hm.\App_Common;.\App_Modbus;.\Arm_Kernel;.\Drv_Common;.\Drv_Modbus;.\Gd32_Hal;.\Gd32_Hal\Include;.\Mid_Modbus;.\Mid_Modbus\rtu;.\Mid_Modbus\include;.\Mid_Lvgl;.\Mid_Lvgl\driver\porting;.\Mid_Lvgl\src;.\Mid_Lvgl\src\core;.\Mid_Lvgl\src\draw;.\Mid_Lvgl\src\extra;.\Mid_Lvgl\src\extra\layouts;.\Mid_Lvgl\src\extra\layouts\flex;.\Mid_Lvgl\src\extra\layouts\grid;.\Mid_Lvgl\src\extra\themes;.\Mid_Lvgl\src\extra\themes\basic;.\Mid_Lvgl\src\extra\themes\default;.\Mid_Lvgl\src\extra\themes\mono;.\Mid_Lvgl\src\extra\widgets;.\Mid_Lvgl\src\extra\widgets\animimg;.\Mid_Lvgl\src\extra\widgets\calendar;.\Mid_Lvgl\src\extra\widgets\chart;.\Mid_Lvgl\src\extra\widgets\colorwheel;.\Mid_Lvgl\src\extra\widgets\imgbtn;.\Mid_Lvgl\src\extra\widgets\keyboard;.\Mid_Lvgl\src\extra\widgets\led;.\Mid_Lvgl\src\extra\widgets\list;.\Mid_Lvgl\src\extra\widgets\menu;.\Mid_Lvgl\src\extra\widgets\meter;.\Mid_Lvgl\src\extra\widgets\msgbox;.\Mid_Lvgl\src\extra\widgets\span;.\Mid_Lvgl\src\extra\widgets\spinbox;.\Mid_Lvgl\src\extra\widgets\spinner;.\Mid_Lvgl\src\extra\widgets\tabview;.\Mid_Lvgl\src\extra\widgets\tileview;.\Mid_Lvgl\src\extra\widgets\win;.\Mid_Lvgl\src\font;.\Mid_Lvgl\src\hal;.\Mid_Lvgl\src\misc;.\Mid_Lvgl\src\widgets;.\App_Hmi

点击左上角打开文件找到

打开,改成1

修改显示驱动

因为我们修改了这个的文件名,所以这里改成这样

设置屏幕分辨率:

在disp_init初始化LCD

配置图像数据缓冲模式,屏蔽这几行

在disp_flush函数中调用LCD驱动显示函数

修改触摸

在touchpad_init函数调用触摸屏初始化

在touchpad_is_pressde函数调用触摸屏驱动检测触摸函数

在touchpad_get_xy函数

我们在工程文件新建App_Hmi,我们把hmi_app.c/h移动到App_Hmi

在工程目录新建

编写hmi_app.c/h

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "rtc_drv.h"
#include "sensor_drv.h"
#include "led_drv.h"
#include "key_drv.h"
#include "touch_drv.h"
#include "lcd_drv.h"
#include "store_app.h"

/* LVGL */
#include "lvgl.h"
#include "lv_port_indev.h"
#include "lv_port_disp.h"
void lv_example_flex_1(void)
{
    /* ① 创建一个横向(ROW)Flex 容器,父对象是当前屏幕 */
    lv_obj_t * cont_row = lv_obj_create(lv_scr_act());
    lv_obj_set_size(cont_row, 300, 75);                  // 宽 300 px,高 75 px
    lv_obj_align(cont_row, LV_ALIGN_TOP_MID, 0, 5);      // 顶部居中,y 向下偏移 5 px
    lv_obj_set_flex_flow(cont_row, LV_FLEX_FLOW_ROW);    // 子项横向顺序排列,不换行

    /* ② 创建一个纵向(COLUMN)Flex 容器,父对象仍是屏幕 */
    lv_obj_t * cont_col = lv_obj_create(lv_scr_act());
    lv_obj_set_size(cont_col, 200, 150);                                // 宽 200 px,高 150 px
    lv_obj_align_to(cont_col, cont_row, LV_ALIGN_OUT_BOTTOM_MID, 0, 5); // 放在横向容器正下方,间距 5 px
    lv_obj_set_flex_flow(cont_col, LV_FLEX_FLOW_COLUMN);                // 子项纵向顺序排列

    uint32_t i;
    for(i = 0; i < 10; i++) {
        lv_obj_t * obj;
        lv_obj_t * label;

        /* ③ 给横向容器添加按钮:固定宽 100 px,高占满父容器 */
        obj = lv_btn_create(cont_row);
        lv_obj_set_size(obj, 100, LV_PCT(100));

        label = lv_label_create(obj);
        lv_label_set_text_fmt(label, "Item: %"LV_PRIu32, i); // 显示序号
        lv_obj_center(label);                                // 标签在按钮内居中

        /* ④ 给纵向容器添加按钮:宽占满父容器,高根据内容自适应 */
        obj = lv_btn_create(cont_col);
        lv_obj_set_size(obj, LV_PCT(100), LV_SIZE_CONTENT);

        label = lv_label_create(obj);
        lv_label_set_text_fmt(label, "Item: %"LV_PRIu32, i);
        lv_obj_center(label);
    }
}
void HmiInit(void)
{
	lv_init();                          /* lvgl系统初始化 */
	lv_port_disp_init();                /* lvgl显示接口初始化,放在lv_init()的后面 */
	lv_port_indev_init();               /* lvgl输入接口初始化,放在lv_init()的后面 */
	lv_example_flex_1();
	//lv_demo_widgets();
}


/**
***********************************************************
* @brief 人机交互任务处理函数
* @param 
* @return 
***********************************************************
*/
void HmiTask(void)
{
	lv_task_handler();
}

当你编译时发现像这样的报错:

说明内存不够了

我们把栈改小

哒哒


网站公告

今日签到

点亮在社区的每一天
去签到