文章目录
- 一、 简介
- 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
找到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 实验现象
查看开发板屏幕
在这里可以看见开发版已成功运行lvgl demo例程
三、代码讲解
3.1 app_main函数
bsp_i2c_init
函数用于初始化I2C,用于触摸与音频bsp_display_start
函数用于初始化显示与LVGLbsp_display_backlight_on
函数用于设置屏幕显示亮度为100%lv_demo_widgets
、lv_demo_music
、lv_demo_stress
、lv_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
}