【正点原子STM32H7R3开发套件试用体验】LVGL
本文介绍了正点原子 STM32H7R3 开发板实现 LVGL 的综合例程开发。
该例程实现了一个基于 LVGL 的 GUI 界面,包含多款 APP 图标,如计算器、文件管理、设置等。
简介
LVGL (Light and Versatile Embedded Graphics Library) 是一个免费的开源图形库,提供创建易于使用的嵌入式 GUI 所需的一切图形元素、美观的视觉效果和低内存占用。

LVGL 是最流行的免费开源嵌入式图形库,可为任何 MCU、MPU 和显示类型创建漂亮的 UI。
从消费电子产品到工业自动化,任何应用程序都可以利用 LVGL 的 30+ 内置小部件、100+ 样式属性、受 Web 启发的布局和支持多种语言的排版系统。

LVGL 是完全开源的,没有外部依赖项,这使得它的移植非常简单。它适用于任何现代 MCU 或 MPU,可与任何 (RT)OS 或裸机设置一起使用,以驱动电子纸、单色、OLED 或 TFT 显示器,甚至显示器。此外,它甚至对于商业项目也是免费的。
LVGL 可与从 100 MHz MCU 到基于 Linux 的多核 MPU 的任何硬件配合使用。领先的芯片供应商已经在其生态系统中支持 LVGL。我们还提供提供无缝集成的即用型项目。这些项目包括最新的存储库、响应式支持和广泛的文档。
主要特点
- 强大的构建块,如按钮、图表、列表、滑块、图像等。
- 具有动画、抗锯齿、不透明度、平滑滚动的高级图形
- 各种输入设备,如触摸板、鼠标、键盘、编码器等。
- UTF-8 编码的多语言支持
- 支持多显示器,即使是混合颜色格式
- 具有类似 CSS 样式的完全可自定义图形元素
- 独立于硬件:与任何微控制器或显示器一起使用
- 可扩展:能够在很少的内存(64 kB 闪存、16 kB RAM)下运行
- 支持操作系统、外部存储器和 GPU,但不是必需的
- 单帧缓冲区操作,即使具有高级图形效果
- 用 C 语言编写,以实现最大的兼容性(兼容 C++)
- 模拟器,用于在没有嵌入式硬件的 PC 上开始嵌入式 GUI 设计
- 在模拟器下开发的用户代码可以与固件共享,以提高 UI 开发效率。
- 绑定到 MicroPython
- 用于快速 GUI 设计的教程、示例、主题
- 文档可在线获取
- 在 MIT 许可下免费和开源
硬件要求
基本上,每个能够驱动显示器的现代控制器都适合运行 LVGL。最低要求是:
- 16、32 或 64 位微控制器或处理器
- 建议使用 > 16 MHz 的时钟速度
- Flash/ROM:> 64 kB(对于非常重要的组件)(建议使用 > 180 kB)
存储库布局
LVGL 项目的所有存储库都托管在 GitHub 上。
硬件准备
- 正点原子 2.8/3.5/4.3/7/10 寸 TFT LCD模块 (仅限 MCU 屏,16 位 8080 并口驱动)
- 触摸屏(电阻式/电容式)
- SD卡(需要将驱动文件放置在根目录)

项目实现
- 开机后运行程序,检测字库,进入主界面,和智能手机类似,点击图标即可进入相应的功能;
- LED1 闪烁指示系统运行。
代码
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./MALLOC/malloc.h"
#include "./FATFS/exfuns/exfuns.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/KEY/key.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/TIMER/btim.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/HYPERRAM/hyperram.h"
#include "./BSP/ADC/adc.h"
#include "./BSP/RTC/rtc.h"
#include "./BSP/SDMMC/sdmmc_sdcard.h"
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"
#include "image.h"
#include "lv_load_image.h"
int main(void)
{
uint8_t key;
uint8_t res;
sys_mpu_config();
sys_cache_enable();
HAL_Init();
sys_stm32_clock_init(300, 6, 2);
delay_init(600);
usart_init(115200);
led_init();
key_init();
beep_init();
lcd_init();
hyperram_init();
adc_init();
gtim_timx_pwm_chy_init(500 - 1, 300 - 1);
rtc_init();
rtc_set_wakeup(RTC_WAKEUPCLOCK_CK_SPRE_16BITS, 0);
my_mem_init(SRAMIN);
my_mem_init(SRAMEX);
my_mem_init(SRAM12);
my_mem_init(SRAMDTCM);
my_mem_init(SRAMITCM);
exfuns_init();
f_mount(fs[0], "0:", 1);
f_mount(fs[1], "1:", 1);
f_mount(fs[2], "2:", 1);
key = key_scan(0);
if (key == KEY1_PRES)
{
goto UPD;
}
while (images_init())
{
UPD:
lcd_clear(WHITE);
lcd_show_string(30, 30, 200, 16, 16, "STM32", RED);
while (sd_init())
{
lcd_show_string(30, 50, 200, 16, 16, "SD Card Failed!", RED);
delay_ms(200);
lcd_fill(30, 50, 200 + 30, 50 + 16, WHITE);
delay_ms(200);
}
lcd_show_string(30, 50, 200, 16, 16, "SD Card OK", RED);
lcd_show_string(30, 70, 200, 16, 16, "image Updating...", RED);
res = images_update_image(20, 90, 16, (uint8_t *)"0:", RED);
while (res)
{
lcd_show_string(30, 90, 200, 16, 16, "image Update Failed!", RED);
delay_ms(200);
lcd_fill(20, 90, 200 + 20, 90 + 16, WHITE);
delay_ms(200);
}
lcd_show_string(30, 90, 200, 16, 16, "image Update Success! ", RED);
delay_ms(1500);
lcd_clear(WHITE);
}
btim_timx_int_init(100 - 1, 30000 - 1);
lv_init();
lv_port_disp_init();
lv_port_indev_init();
lv_load_main_window();
while (1)
{
lv_timer_handler();
delay_ms(5);
}
}
完整工程见附件。
*附件:Demo5_LVGL_4.3inch_MCU_Screen.zip
效果
LVGL 桌面及应用图标显示

计算器效果

文件管理展示

总结
本文介绍了正点原子 STM32H7R3 开发套件实现 LVGL 界面 GUI 的实现,通过调试和运行代码,测试了其终端应用功能,包括文件管理、计算器、设置等,为相应开发提供了参考。