文章目录

  • 一、 简介
  • 1.1 硬件介绍
  • 1.2 官方资料
  • 1.3 开发环境
  • 1.4 LVGL介绍
  • 二、运行LVGL官方例程
  • 2.1 组件添加
  • 2.2 添加代码
  • 2.3 实验现象
  • 三、代码讲解
  • 3.1 app_main函数
  • 四、代码地址


一、 简介

1.1 硬件介绍

ESP32-S3 SoC 芯片支持以下功能:

  • 2.4 GHz Wi-Fi
  • 低功耗蓝牙
  • 高性能 Xtensa® 32 位 LX7 双核处理器
  • 运行 RISC-V 或 FSM 内核的超低功耗协处理器
  • 多种外设
  • 内置安全硬件
  • USB OTG 接口
  • USB 串口/JTAG 控制

1.2 官方资料

ESP-IDF编程指南LVGL官方文档esp32_s3_lcd_ev_board开发板

1.3 开发环境

软件:IDF 5.1.2
硬件:ESP32-S3-LCD-EV-Board-MB 开发

1.4 LVGL介绍

LVGL是一个开源的图形库,专门为嵌入式系统设计,用于创建具有触摸支持的图形用户界面(Graphical User Interfaces, GUIs)。

主要特点

  • 轻量级(Lightweight):它针对资源受限的系统优化,占用的内存和处理器资源非常少。
  • 高度可配置(Highly Configurable):用户可以根据自己的需求定制很多特性。
  • 简洁的API(Easy-to-use API):提供直观的API接口,使得开发人员可以相对轻松地实现复杂的用户界面。
  • 多样的控件(Wide Range of Widgets):支持按钮、滑块、图表、列表等多种控件,且这些控件易于自定义。
  • 外观美观(Modern Look and Feel):具有现代化的控件样式和动画效果。
  • 硬件无关性(Hardware Independent):可以在任何有足够计算能力和存储空间的硬件上运行,不受特定处理器或显示器的限制。
  • 支持多种输入设备(Supports Various Input Devices):可以与触摸屏、鼠标、键盘等输入设备无缝集成。
  • 国际化(Internationalization):支持多语言和Unicode字符。

应用场景
LVGL适用于各种从简单的控制面板到全功能的手持设备的嵌入式项目。由于它的灵活性和可扩展性,开发者可以为智能手表、家用电器、医疗设备等提供吸引人的用户界面。

二、运行LVGL官方例程

2.1 组件添加

前往乐鑫组件管理器搜索esp32_s3_lcd_ev_board

ESP32 Sample Code下载 esp32-s_学习


找到led_strip组件,在当前工程目录下使用以下命令添加组件

idf.py add-dependency "espressif/esp32_s3_lcd_ev_board^2.1.0"

2.2 添加代码

此时将main.c文件修改为以下内容

/*
 * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: CC0-1.0
 */

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"

#include "lv_demos.h"
#include "bsp/esp-bsp.h"

static char *TAG = "app_main";

#define LOG_MEM_INFO    (0)

void app_main(void)
{
    /* Initialize I2C (for touch and audio) */
    bsp_i2c_init();

    /* Initialize display and LVGL */
    bsp_display_start();

#if CONFIG_BSP_DISPLAY_LVGL_AVOID_TEAR
    ESP_LOGI(TAG, "Avoid lcd tearing effect");
#if CONFIG_BSP_DISPLAY_LVGL_FULL_REFRESH
    ESP_LOGI(TAG, "LVGL full-refresh");
#elif CONFIG_BSP_DISPLAY_LVGL_DIRECT_MODE
    ESP_LOGI(TAG, "LVGL direct-mode");
#endif
#endif

    /* Set display brightness to 100% */
    bsp_display_backlight_on();

    ESP_LOGI(TAG, "Display LVGL demo");
    bsp_display_lock(0);
    lv_demo_widgets();      /* A widgets example */
    //lv_demo_music();        /* A modern, smartphone-like music player demo. */
    // lv_demo_stress();       /* A stress test for LVGL. */
    //lv_demo_benchmark();    /* A demo to measure the performance of LVGL or to compare different settings. */
    bsp_display_unlock();

#if LOG_MEM_INFO
    static char buffer[128];    /* Make sure buffer is enough for `sprintf` */
    while (1) {
        sprintf(buffer, "   Biggest /     Free /    Total\n"
                "\t  SRAM : [%8d / %8d / %8d]\n"
                "\t PSRAM : [%8d / %8d / %8d]",
                heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL),
                heap_caps_get_free_size(MALLOC_CAP_INTERNAL),
                heap_caps_get_total_size(MALLOC_CAP_INTERNAL),
                heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM),
                heap_caps_get_free_size(MALLOC_CAP_SPIRAM),
                heap_caps_get_total_size(MALLOC_CAP_SPIRAM));
        ESP_LOGI("MEM", "%s", buffer);

        vTaskDelay(pdMS_TO_TICKS(500));
    }
#endif
}

2.3 实验现象

查看开发板屏幕

ESP32 Sample Code下载 esp32-s_笔记_02


在这里可以看见开发版已成功运行lvgl demo例程

三、代码讲解

3.1 app_main函数

bsp_i2c_init函数用于初始化I2C,用于触摸与音频
bsp_display_start函数用于初始化显示与LVGL
bsp_display_backlight_on函数用于设置屏幕显示亮度为100%
lv_demo_widgetslv_demo_musiclv_demo_stresslv_demo_benchmark函数为LVGL官方提供的测试例程

void app_main(void)
{
    /* Initialize I2C (for touch and audio) */
    bsp_i2c_init();

    /* Initialize display and LVGL */
    bsp_display_start();

#if CONFIG_BSP_DISPLAY_LVGL_AVOID_TEAR
    ESP_LOGI(TAG, "Avoid lcd tearing effect");
#if CONFIG_BSP_DISPLAY_LVGL_FULL_REFRESH
    ESP_LOGI(TAG, "LVGL full-refresh");
#elif CONFIG_BSP_DISPLAY_LVGL_DIRECT_MODE
    ESP_LOGI(TAG, "LVGL direct-mode");
#endif
#endif

    /* Set display brightness to 100% */
    bsp_display_backlight_on();

    ESP_LOGI(TAG, "Display LVGL demo");
    bsp_display_lock(0);
    lv_demo_widgets();      /* A widgets example */
    //lv_demo_music();        /* A modern, smartphone-like music player demo. */
    // lv_demo_stress();       /* A stress test for LVGL. */
    //lv_demo_benchmark();    /* A demo to measure the performance of LVGL or to compare different settings. */
    bsp_display_unlock();

#if LOG_MEM_INFO
    static char buffer[128];    /* Make sure buffer is enough for `sprintf` */
    while (1) {
        sprintf(buffer, "   Biggest /     Free /    Total\n"
                "\t  SRAM : [%8d / %8d / %8d]\n"
                "\t PSRAM : [%8d / %8d / %8d]",
                heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL),
                heap_caps_get_free_size(MALLOC_CAP_INTERNAL),
                heap_caps_get_total_size(MALLOC_CAP_INTERNAL),
                heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM),
                heap_caps_get_free_size(MALLOC_CAP_SPIRAM),
                heap_caps_get_total_size(MALLOC_CAP_SPIRAM));
        ESP_LOGI("MEM", "%s", buffer);

        vTaskDelay(pdMS_TO_TICKS(500));
    }
#endif
}