你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【Zephyr | STM32L562-DK】3 基于Zephyr RTOS LVGL测试

[复制链接]
lugl 发布时间:2026-9-8 14:35

基于Zephyr RTOS LVGL的测试工程

硬件

STM32L562E-DK

软件环境

Zephyr RTOS sdk 4.4.0

工程目录

image.png

软件实现

1、prj.con

在配置中,需要打display、lvgl 、触摸、字体并配置合适的栈空间。代码如下:

CONFIG_MAIN_STACK_SIZE=4096

CONFIG_DISPLAY=y
CONFIG_INPUT=y
CONFIG_LVGL=y
CONFIG_LV_Z_MEM_POOL_SIZE=32768

CONFIG_LV_FONT_MONTSERRAT_14=y
CONFIG_LV_FONT_MONTSERRAT_20=y

2、添加一个ui界面文件,里面添加两个按键以后哪个按下的标,以及计数据标签,代码如下:

/*
 * LVGL test UI for STM32L562E-DK: title, status/counter labels
 * and two touch buttons.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <lvgl.h>

#include "lvgl_ui.h"

static lv_obj_t *status_label;
static lv_obj_t *count_label;
static uint32_t press_count;

static void update_count_label(void)
{
    lv_label_set_text_fmt(count_label, "Press count: %u", press_count);
}

static void btn_event_cb(lv_event_t *e)
{
    const char *name = lv_event_get_user_data(e);

    press_count++;
    lv_label_set_text_fmt(status_label, "Pressed: %s", name);
    update_count_label();
}

static lv_obj_t *create_button(lv_obj_t *parent, const char *text, lv_coord_t x_ofs,
                   lv_coord_t y_ofs, lv_color_t color)
{
    lv_obj_t *btn = lv_button_create(parent);

    lv_obj_set_size(btn, 90, 44);
    lv_obj_align(btn, LV_ALIGN_BOTTOM_MID, x_ofs, y_ofs);
    lv_obj_set_style_bg_color(btn, color, LV_PART_MAIN);
    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, (void *)text);

    lv_obj_t *label = lv_label_create(btn);

    lv_label_set_text(label, text);
    lv_obj_set_style_text_font(label, &lv_font_montserrat_14, LV_PART_MAIN);
    lv_obj_center(label);

    return btn;
}

void lvgl_ui_create(void)
{
    lv_obj_t *screen = lv_screen_active();

    /* dark blue background */
    lv_obj_set_style_bg_color(screen, lv_color_hex(0x003a57), LV_PART_MAIN);
    lv_obj_set_style_bg_opa(screen, LV_OPA_COVER, LV_PART_MAIN);

    /* main title */
    lv_obj_t *title = lv_label_create(screen);

    lv_label_set_text(title, "Hello World!");
    lv_obj_set_style_text_font(title, &lv_font_montserrat_20, LV_PART_MAIN);
    lv_obj_set_style_text_color(title, lv_color_white(), LV_PART_MAIN);
    lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 30);

    /* subtitle */
    lv_obj_t *subtitle = lv_label_create(screen);

    lv_label_set_text(subtitle, "STM32L562E-DK + LVGL");
    lv_obj_set_style_text_font(subtitle, &lv_font_montserrat_14, LV_PART_MAIN);
    lv_obj_set_style_text_color(subtitle, lv_color_hex(0x00cfc1), LV_PART_MAIN);
    lv_obj_align(subtitle, LV_ALIGN_TOP_MID, 0, 62);

    /* status + counter feedback */
    status_label = lv_label_create(screen);
    lv_label_set_text(status_label, "Touch a button...");
    lv_obj_set_style_text_font(status_label, &lv_font_montserrat_14, LV_PART_MAIN);
    lv_obj_set_style_text_color(status_label, lv_color_hex(0xffe37e), LV_PART_MAIN);
    lv_obj_align(status_label, LV_ALIGN_TOP_MID, 0, 100);

    count_label = lv_label_create(screen);
    lv_obj_set_style_text_font(count_label, &lv_font_montserrat_14, LV_PART_MAIN);
    lv_obj_set_style_text_color(count_label, lv_color_white(), LV_PART_MAIN);
    lv_obj_align(count_label, LV_ALIGN_TOP_MID, 0, 126);
    update_count_label();

    /* two touch buttons at the bottom */
    create_button(screen, "BTN A", -52, -30, lv_color_hex(0x2b8a3e));
    create_button(screen, "BTN B", 52, -30, lv_color_hex(0xc92a2a));
}

3、main.c

在main.c中,初始化lvgl并在while中调用tick来响应触摸

/*
 * LVGL Hello World + touch buttons for STM32L562E-DK (240x240 ST7789V)
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/display.h>
#include <lvgl.h>
#include <lvgl_zephyr.h>
#include <stdio.h>

#include "lvgl_ui.h"

int main(void)
{
    const struct device *display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));

    if (!device_is_ready(display_dev)) {
        printf("Display device not ready, aborting\n");
        return 0;
    }

    lvgl_lock();
    lvgl_ui_create();
    lv_timer_handler();
    lvgl_unlock();

    int ret = display_blanking_off(display_dev);

    if (ret < 0 && ret != -ENOSYS) {
        printf("Failed to turn blanking off (error %d)\n", ret);
        return 0;
    }

    printf("LVGL Hello World started\n");

    while (1) {
        uint32_t sleep_ms;

        lvgl_lock();
        sleep_ms = lv_timer_handler();
        lvgl_unlock();

        k_msleep(MIN(sleep_ms, INT32_MAX));
    }

    return 0;
}

实现效果:

LVGL测试.png

收藏 评论0 发布时间:2026-9-8 14:35

举报

0个回答

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版