cubemx6.0配置LVGL7.8
发布日期: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 系统中,并实现基本的显示和触摸功能。

    上一篇:stm32 LTDC配置液晶屏时序检查方法
    下一篇:cubemx6.0配置touchgfx 正点原子触摸屏,touchgfx添加触摸驱动

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年04月01日 16时39分04秒