lvgl8.x 移植到 stm32f4

本文档详述了如何将LVGL图形库移植到STM32微控制器的过程,包括对芯片的硬件要求、源码下载、目录结构解析、工程文件删减与重命名、添加源码到Keil5项目、配置文件修改、堆栈大小调整、C99模式设置以及屏幕绘图接口对接的初步步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 对芯片的要求

  • 处理器 163264 位微控制器或处理器
  • 时钟频率最低 16 MHz 时钟频率
  • Flash/ROM 对于非常重要的组件要求大于 64 kB (建议大于180 kB)
  • RAM 静态 RAM 使用量约 2 kB,取决于所使用的功能和对象类型
    堆栈:大于 2kB (建议大于 8 kB)
    动态数据(堆):大于 2 KB(如果使用多个对象,则建议大于 16 kB)。由 lv_conf.h 中的 LV_MEM_SIZE 宏进行设置
    显示缓冲区:大于水平分辨率像素(建议大于 10 行水平分辨率),MCU 或外部显示控制器中的一帧缓冲区
  • 编译器必须支持 C99 或更高版本的编译器
  • 技术栈具备基本的 C (或C ++) 知识:指针,结构,回调

2. 下载源码包

在移植之前需要先下载源码包,源码包可以通过使用 GitHub 进行克隆或下载,在 Github 中搜索 lvgl 即可搜索到 lvgl 的官方仓库,进入官方仓库即可使用 git 克隆到电脑本地,或直接点击下载同样可将整个源码包下载到电脑本地中。

3. 概览源码目录

20220111232911.jpg
主要需要使用的有:examples/src/lv_conf_template.hlvgl.h。分别为 lvgl 例程文件夹源码文件夹lvgl 配置文件模板lvgl 主要头文件

3.1. src 源码目录

20220111234357.jpg
core 核心源码
draw 绘图源码
extra 用于实现额外功能,一些高级界面实现
20220112000010.jpg
font 内置字体
gpu GPU 驱动实现,这需要所使用的芯片支持
hal 硬件抽象层
misc 杂项
widget 基础界面组件

3.2. examples 例程目录

20220111234424.jpg
anim 动画使用例程
arduino 支持 arduino 的配置文件,一般不使用,除非使用 arduino
assets 一些小组件的代码或图片数组,为了便于知道代码产生的样式还配套了对应样式图片
event 一些 lvgl 事件编写与使用例程
get_started 组件使用例程
layouts lvgl 布局使用例程
porting lvgl 驱动对接方法模板
scroll lvgl 滚动使用例程
styles 组件风格使用例程
widgets 同样是 lvgl 组件使用例程
总体来说这个文件夹都是顾名思义为一些使用参考代码,想快速的查看效果就可以复制使用这里的代码来生 成需要的组件进行查看,这个目录较为常用。

4. stm32 模板工程

移植 lvgl 之前我们需要搭建一个能够编译 stm32 代码的编译工程,用于编译 stm32 相关代码文件(比如常用的 Keil-MDK 工程)。对于开发人机界面来说此时也需要准备一块显示屏(至于什么样的显示屏都可以,lvgl 内部并不关心你使用的是何种屏幕),并使用 stm32 来驱动它。至于如何搭建 stm32 编译工程这里并不介绍,因为这里主要说明如何来将 lvgl 移植到 stm32,同时相信能够看到这里那一定已经知道如何搭建 stm32 的编译工程了。

注意:这里 keil 版本使用 keil5.26
STM32 使用 STM32F407VET6当然这个移植方法不仅适用于 STM32F407VET6,stm32 系列单片机或其他类型的单片机均适用

5. 开始移植

5.1 删减不需要使用的文件夹和文件

解压前面下载的 lvgl 源码包可以得到一个 lvgl-8.0.2 文件夹,留下 lvgl-8.0.2/examples/文件夹,lvgl-8.0.2/src/文件夹,lvgl-8.0.2/LICENCE.txt文件,lvgl-8.0.2/lv_conf_template.h文件lvgl-8.0.2/lvgl.h文件lvgl-8.0.2/README.md文件,其余均可删除。
同时将 lvgl-8.0.2/examples/porting文件夹剪切到上一层目录(即 lvgl-8.0.2/),最后如下图所示
20220113231114.jpg

5.2 重命名文件

lvgl-8.0.2/lv_conf_template.h 文件改为 lv_conf.h,(配置文件)
lvgl-8.0.2/porting/lv_port_disp_template.c 文件改为 lv_port_disp.c (显示相关)
lvgl-8.0.2/porting/lv_port_disp_template.h 文件改为 lv_port_disp.h(显示相关)
lvgl-8.0.2/porting/lv_port_fs_template.c 文件改为 lv_port_fs.c(文件系统相关)
lvgl-8.0.2/porting/lv_port_fs_template.c 文件改为 lv_port_fs.h(文件系统相关)
lvgl-8.0.2/porting/lv_port_indev_template.c 文件改为 lv_port_indev.c(输入设备相关)
lvgl-8.0.2/porting/lv_port_indev_template.c 文件改为 lv_port_indev.c(输入设备相关)

6. 添加 lvgl 文件到 keil5

6.1 添加 lvgl 源码

添加 lvgl-8.0.2/src/core 目录下的所有 c 文件
添加 lvgl-8.0.2/src/draw 目录下的所有 c 文件
添加 lvgl-8.0.2/src/extra 目录下的所有 c 文件
添加 lvgl-8.0.2/src/font 目录下的所有 c 文件
添加 lvgl-8.0.2/src/gpu 目录下的所有 c 文件
添加 lvgl-8.0.2/src/hal 目录下的所有 c 文件
添加 lvgl-8.0.2/src/misc 目录下的所有 c 文件
添加 lvgl-8.0.2/src/widgets 目录下的所有 c 文件
20220113235157.jpg

添加 lvgl-8.0.2/porting/lv_port_disp.c ,因为这里仅查看移植成功后的显示效果,所以这里目前仅添加显示相关设备接口文件。
20220113235206.jpg

6.2 添加 lvgl 源码头文件路径

需要添加的头文件路径有如下几个
lvgl8.0.2/
lvgl8.0.2/src
lvgl8.0.2/porting

详细查看:https://cloud.tencent.com/developer/article/1862110

7. 修改 lv_conf.h

将 lvgl 配置头文件的 条件编译置为 1,启用配置。
20220114114942.jpg

8. 修改 stm32 堆栈大小

打开 stm32 的启动文件进行修改,如下图
20220114095613.jpg

9. keil c99 模式

按照下图所示的步骤可以将 keil5 设置为 c99 模式。
20220114103714.jpg

10. 对接屏幕绘图接口

该部分详细内容查看后面的文章 lvgl8.0 对接屏幕驱动 这部分。

### STM32F4 LVGL 图形移植教程 #### 使用 VSCode 和 PlatformIO 开发环境准备 为了简化开发流程并提高效率,推荐使用集成化程度较高的IDE来管理项目。VSCode配合PlatformIO插件可以很好地支持STM32平台下的C/C++编程工作[^1]。 #### HAL 与正点原子资料的应用 对于硬件抽象层(HAL),建议采用ST官方提供的版本以确保兼容性和稳定性;而针对具体型号(如STM32F407ZGT6)的学习材料,则可参考正点原子团队编写的文档和视频教程,这些资源能够帮助理解底层驱动原理以及如何利用它们实现高级功能。 #### 配置 `lv_conf.h` 文件 在开始移植之前,需先下载最新版的LVGL源码包,并将其解压至合适位置。接着找到位于根目录下的`lv_conf_template.h`模板文件,复制一份重命名为`lv_conf.h`以便后续修改。此配置文件包含了量宏定义用于调整GUI框架的行为特性,比如颜色深度、字体小等参数设置均在此处完成[^3]。 ```c // lv_conf.h 中的部分重要选项举例说明: /* Color depth settings */ #define LV_COLOR_DEPTH 16 /* Use RGB565 color format */ /* Font setting */ extern const lv_font_t lv_font_simsun_16_cjk; LV_FONT_CUSTOM_DECLARE(lv_font_custom = &lv_font_simsun_16_cjk); #define LV_FONT_DEFAULT (&lv_font_custom) /* Display buffer size (in pixels)*/ #define LV Disp_BUF_SIZE (80 * 60) ``` #### 初始化显示设备接口函数编写 根据所使用的LCD模块类型,在应用程序入口(`main.c`)附近创建一个新的`.c/.h`文件对组用来封装屏幕控制逻辑。这里主要涉及到了几个方面的工作:初始化SPI/IIC通信总线连接显示屏控制器芯片;注册回调处理触摸屏事件输入;最后还要向LVGL注册一个刷新缓冲区更新方法让其知道何时何地绘制图像数据到物理屏幕上[^2]。 ```c #include "lvgl/lvgl.h" #include "lcd_driver.h" // 假设这是自定义的液晶显示器驱动头文件名 #include "touch_panel.h" // 同上,触控面板对应的API声明所在的位置 static void disp_flush_cb(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p){ uint32_t w = (area->x2 - area->x1 + 1); uint32_t h = (area->y2 - area->y1 + 1); lcd_set_window(area->x1, area->y1, w,h); lcd_write_pixels(color_p,w*h); lv_disp_flush_ready(disp); } void init_lvgl(void){ static lv_disp_buf_t buf; static lv_color_t scr_buff[DISP_BUF_SIZE]; lv_init(); lv_disp_buf_init(&buf,scr_buff,NULL, DISP_BUF_SIZE); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.buffer = &buf; disp_drv.flush_cb=disp_flush_cb; lv_disp_drv_register(&disp_drv); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值