本文介绍了正点原子 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。我们还提供提供无缝集成的即用型项目。这些项目包括最新的存储库、响应式支持和广泛的文档。
基本上,每个能够驱动显示器的现代控制器都适合运行 LVGL。最低要求是:
LVGL 项目的所有存储库都托管在 GitHub 上。

#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(); /* 配置MPU */
sys_cache_enable(); /* 使能Cache */
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(300, 6, 2); /* 配置时钟,600MHz */
delay_init(600); /* 初始化延时 */
usart_init(115200); /* 初始化串口 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按键 */
beep_init(); /* 初始化蜂鸣器 */
lcd_init(); /* LCD初始化 */
hyperram_init(); /* 初始化HyperRAM */
adc_init(); /* 初始化ADC */
gtim_timx_pwm_chy_init(500 - 1, 300 - 1); /* 初始化通用定时器PWM输出 */
rtc_init(); /* 初始化RTC */
rtc_set_wakeup(RTC_WAKEUPCLOCK_CK_SPRE_16BITS, 0); /* 设置RTC周期性唤醒中断 */
my_mem_init(SRAMIN); /* 初始化AXI-SRAM1~4内存池 */
my_mem_init(SRAMEX); /* 初始化XSPI2 HyperRAM内存池 */
my_mem_init(SRAM12); /* 初始化AHB-SRAM1~2内存池 */
my_mem_init(SRAMDTCM); /* 初始化DTCM内存池 */
my_mem_init(SRAMITCM); /* 初始化ITCM内存池 */
exfuns_init(); /* 为fatfs相关变量申请内存 */
f_mount(fs[0], "0:", 1); /* 挂载SD卡 */
f_mount(fs[1], "1:", 1); /* 挂载NOR Flash */
f_mount(fs[2], "2:", 1); /* 挂载SD NAND */
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()) /* 检测SD卡 */
{
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); /* 10ms中断一次,为LVGL提供时基 */
lv_init(); /* lvgl系统初始化 */
lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */
lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */
lv_load_main_window(); /* 加载主页面 */
while (1)
{
lv_timer_handler(); /* lvgl计时器 */
delay_ms(5);
}
}
完整工程见附件。
*附件:Demo5_LVGL_4.3inch_MCU_Screen.zip
LVGL 桌面及应用图标显示

计算器效果

文件管理展示

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