
cubemx6.0配置LVGL7.8
去掉所有 将
1.
2.
发布日期:2021-05-09 16:41:11
浏览次数:23
分类:精选文章
本文共 3177 字,大约阅读时间需要 10 分钟。
移植 LVGL 到 STM32 系统
1. 下载与准备
首先,我们需要从 LVGL 的官方仓库下载最新的源代码。下载完成后,我们需要对源代码进行一些必要的修改,以便适配 STM32 系统。
修改配置文件
在 lvgl
目录下找到 lv_conf.h
文件,将其修改为:
#define LV_HOR_RES_MAX (1024)#define LV_VER_RES_MAX (600)#define LV_USE_GPU 0 // 启用 GPU 加速(可选)#define LV_USE_GPU_STM32_DMA2D 1 // 启用 STM32 的 DMA2D 加速#define LV_GPU_DMA2D_CMSIS_INCLUDE "stm32f429xx.h" // 替换为你的开发板型号头文件
此外,我们还需要修改 lv_ex_conf.h
文件,将 if 0
修改为 if 1
,并将其复制到项目根目录下。
移动示例文件
将 example/porting
目录下的文件移动到 lvgl_port
目录,并对所有源文件进行以下修改:
template
后缀。lv_ex_conf.h
中的 if 0
修改为 if 1
。完成上述步骤后,编译项目,确保所有头文件路径正确。
2. 配置 Keil 工程
创建文件夹结构
创建以下文件夹结构:
your_project/├── src/│ ├── lvgl/│ │ └── core/│ │ └── src/│ │ └── ...│ └── port/└── example/ └── widgets/ └── lv_demoWidgets.c
将源文件添加到项目
将 lvgl_core/src
目录下的所有源文件添加到 lvgl/core
目录,确保头文件路径正确。
3. 移植工作
修改移植文件
1. lv_port_disp.c
移植
在 lv_port_disp.c
中实现显示初始化和缓冲区设置:
static void disp_init(void) { // 初始化 LCD 显示 // 例如: // LCD_InitTypeDefTypeDef LCD_InitStructure; // RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOC | RCC_APB1Periph_SDMA); // 根据你的 LCD 模型调整 // GPIO_InitTypeDef GPIO_InitStructure; // GPIO_PinPull GPIO_PinPullDown; // SDMA_InitTypeDef SDMA_InitStructure; // ...}static lv_disp_buf_t draw_buf_dsc_1;static lv_color_t color_buf[1024 * 600] __attribute__((at(0x80000000)));static lv_color_t color_buf2[1024 * 600] __attribute__((at(0x80008000)));lv_disp_buf_init(&draw_buf_dsc_1, color_buf, color_buf2, 1024, 600);disp_drv.hor_res = LV_HOR_RES_MAX;disp_drv.ver_res = LV_VER_RES_MAX;
2. disp_flush
函数实现
static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { // 使用 DMA2D 加速刷图 // 例如: // LTDC_Color_Fill(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p); // lv_disp_flush_ready(disp_drv);}static void disp_flush_ready(lv_disp_drv_t *disp_drv) { // 添加 flush 完成回调(可选)}
3. 触摸移植
在 lv_port_indev.c
中实现触摸接口:
static bool touchpad_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) { static lv_coord_t last_x = 0; static lv_coord_t last_y = 0; if (touch_get(&tx, &ty)) { last_x = tx; last_y = ty; data->state = LV_INDEV_STATE_PR; } else { data->state = LV_INDEV_STATE_REL; } data->point.x = last_x; data->point.y = last_y; return false;}
4. 添加定时器
在 main.c
中添加定时器,确保触摸刷新率足够高:
// 定时器配置(例如使用 TIM6)void TIM6_DAC_IRQHandler(void) { lv_tick_inc(1); // 其他定时器处理(可选)}int main() { lv_init(); lv_port_disp_init(); lv_port_indev_init(); lv_demo_widgets(); // 定时器初始化 // 例如: // HAL_TIM_Init(&tim6_config); // HAL_TIM_SetCounter(&tim6_config, TIM_COUNTERMODE_COURSE); // HAL_TIM_SetPeriod(&tim6_config, TIM_PERIOD_MS(1)); // HAL_TIM_Start(&tim6_config); while (1) { touch_scan(); lv_task_handler(); } return 0;}
4. 使用
编译项目后,运行 main.c
,即可在 STM32 显示界面上运行 LVGL 组件。
5. GPU 加速配置
在 lv_conf.h
中启用 GPU 加速:
#define LV_USE_GPU 1#define LV_USE_GPU_STM32_DMA2D 1#define LV_GPU_DMA2D_CMSIS_INCLUDE "stm32f429xx.h"
6. 代码下载
Git 仓库
git clone https://github.com/lvgl/lvgl.git
CSDN
如果需要下载完整代码,可以访问相关话题。
通过以上步骤,你可以成功将 LVGL 移植到 STM32 系统中,并实现基本的显示和触摸功能。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月01日 16时39分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
稀疏数组
2019-03-06
83. Remove Duplicates from Sorted List
2019-03-06
Nmap扫描工具介绍
2019-03-06
常用Windows 快捷键
2019-03-06
linux命令-压缩与打包
2019-03-06
oracle 11g not in 与not exists 那个高效?
2019-03-06
玩玩小爬虫——试搭小架构
2019-03-06
Javascript之旅——第九站:吐槽function
2019-03-06
Sql Server之旅——第十站 看看DML操作对索引的影响
2019-03-06
双十一来了,别让你的mongodb宕机了
2019-03-06
深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
2019-03-06
Python大神编程常用4大工具,你用过几个?
2019-03-06
一文带你了解图神经网络
2019-03-06
centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
2019-03-06
【Flink】Flink 底层RPC框架分析
2019-03-06
MySQL错误日志(Error Log)
2019-03-06