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

【STM32F769I-DISC1】移植LVGL

[复制链接]
lugl 发布时间:2025-3-7 12:57

【STM32F769I-DISC1】硬件SPI驱动ST7789LCD - ST中文论坛活动 ST意法半导体中文论坛

在这一篇中,我驱动好了ST7789的LCD屏。本章将介绍如何移植LVGL。

【源码下载】

Release Release v8.3.1 · lvgl/lvgl

之所以不选最新的版本,因为以后我想用一款开源工具来设计UI所以选择这个版本。

【文件复制】

在工程目录下面建一个LVGL的文件夹,把工程源码中的src、demos、examples三个文件夹复到LVGL目录下。把源码的根目录下面的lvgl.h、lv_conf_template.h复制到LVGL目录下,并把lv_conf_template.h重命名为lv_conf.h。复制完以后,如下图所示:

image.png

【CMakelist.txt文件编制】

在TrdParty目录下面新建一个CmakeLists.txt文件。内容如下,主要就是把必须的.c/h给包含进去。




add_library(TrdParty INTERFACE)

set(LVGL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/LVGL)
file(GLOB_RECURSE LVGL_SUBDIRS RELATIVE ${LVGL_DIR} ${LVGL_DIR}/*)
# 过滤出目录,同时排除包含 demos 和 examples 的目录
set(LVGL_INCLUDE_DIRS)
foreach(DIR ${LVGL_SUBDIRS})
    if(IS_DIRECTORY ${LVGL_DIR}/${DIR} AND NOT ${DIR} MATCHES "demos")
        list(APPEND LVGL_INCLUDE_DIRS ${LVGL_DIR}/${DIR})
    endif()
endforeach()
list(APPEND LVGL_INCLUDE_DIRS ${LVGL_DIR})

# 设置目标的包含目录
target_include_directories(TrdParty INTERFACE ${LVGL_INCLUDE_DIRS})


# 定义一个空列表用于存储所有源文件路径
set(LVGL_SOURCES "")
file(GLOB CORE_SOURCES "./LVGL/src/core/*.c")
list(APPEND LVGL_SOURCES ${CORE_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/draw/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/extra/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/font/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/hal/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/widgets/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/extra/layouts/grid/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/extra/layouts/flex/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/extra/widgets/**/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/extra/themes/**/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/draw/sw/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/src/misc/*.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
file(GLOB DRAW_SOURCES "./LVGL/examples/porting/lv_port_disp.c")
list(APPEND LVGL_SOURCES ${DRAW_SOURCES})
# 将汇总后的源文件添加到目标 TirdPrty 的 INTERFACE 源中
target_sources(TrdParty INTERFACE ${LVGL_SOURCES})

image.png
image.png
收藏 评论2 发布时间:2025-3-7 12:57

举报

2个回答
lugl 回答时间:2025-3-7 12:59:10

【相关文件的修改】

1、打开lv_conf.h,把if 0 修改为1 开启代码。定义好屏的宽与高。同时根据自己的设计,打开与关闭相关的配置。

2、打开expamples下porting文件夹,把lv_port_disp_template.h/c 去掉_template,记得把include头文件也修改一下。同时把if 0 修改为1。

3、把lcd.h添加到lv_port_disp.c中。

4、在函数disp_flush,添加画点程序lcd_draw_point(x, y, color_p->full);

5、在函数lv_port_disp_init,打开缓存刷新的定义,如下图:

image.png

image.png

lugl 回答时间:2025-3-7 13:02:07

【测试代码】

在main.c中添加测试代码如下:

/* USER CODE BEGIN 0 */
void LVGL_CentralButton(void)
{
  lv_obj_t *btn = lv_btn_create(lv_scr_act());
  lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
  lv_obj_set_height(btn, 40);

  lv_obj_t *label;
  label = lv_label_create(btn);
  lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
  lv_label_set_text(label, "LVGL");

  static lv_style_t style_btn;
  lv_style_init(&style_btn);
  lv_style_set_radius(&style_btn, 10);
  lv_style_set_border_color(&style_btn, lv_color_white());
  lv_style_set_border_opa(&style_btn, LV_OPA_30);
  lv_obj_add_style(btn, &style_btn, LV_STATE_DEFAULT);
}
void lv_example_label_1(void)
{
  lv_obj_t *label1 = lv_label_create(lv_scr_act());
  lv_label_set_long_mode(label1, LV_LABEL_LONG_WRAP); /*Break the long lines*/
  lv_label_set_text(label1, "Recolor is not supported for v8 now.");
  lv_obj_set_width(label1, 128); /*Set smaller width to make the lines wrap*/
  lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0);
  lv_obj_align(label1, LV_ALIGN_CENTER, 0, -60);

  lv_obj_t *label2 = lv_label_create(lv_scr_act());
  lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/
  lv_obj_set_width(label2, 120);
  lv_label_set_text(label2, "STM32F769LCD");
  lv_obj_align(label2, LV_ALIGN_CENTER, 0, 40);
}
void LVGL_Init(void)
{
  lv_init();           // lvgl初始化,如果这个没有初始化,那么下面的初始化会崩溃
  lv_port_disp_init(); // 显示器初始化
                       // lv_port_indev_init();       // 输入设备初始化(如果没有实现就注释掉)
                       // lv_port_fs_init();          // 文件系统设备初始化(如果没有实现就注释掉)
}
/* USER CODE END 0 */

在main函数中引入上面两个函数,同时在while中周期调用

  /* USER CODE END 2 */
  LVGL_Init();
  LVGL_CentralButton();
  lv_example_label_1();
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
  while (1)
  {
    lv_task_handler();

编译后下载效果如下图所示:

ecb3ba45a83a39928476944ab73c7e6.jpg

所属标签

ST中文论坛活动

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


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版