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

【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 回答时间:前天 12:59

【相关文件的修改】

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 回答时间:前天 13:02

【测试代码】

在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分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版