赞
踩
前期准备:IDF 4.4 + vscode + 3.5寸SPI TFT-LCD显示屏(我的驱动器是ILI9488,无触控)
这里同样通过指令拉取。首先输入指令cd ./components定位到components文件夹路径(要注意输入的格式以及文件名正确)
再输入指令git clone https://github.com/lvgl/lvgl.git拉取lvgl。
我这里网络有问题,拉取不了可以进入网站下载,下载到工程文件夹components里面。
链接:GitHub - lvgl/lvgl at release/v8.3 这里选择8.3版本
再下载lvgl_esp32_driver驱动文件。选择master版本,同样下载到components文件夹下
链接:GitHub - lvgl/lvgl_esp32_drivers: Drivers for ESP32 to be used with LVGL
解压并重命名。lvgl_release重命名为lvgl,lvgl_esp32_drivers_master重命名为lvgl_esp32_drivers
重新打开工程,这时候主函数还没有编写,先编译编译,保证编译通过再编写主函数。
(编译时会有错误提示。我这里是修改好的,跟着错误提示修改即可)
main.c
- #include <stdio.h>
-
- #include <stdbool.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "freertos/semphr.h"
- #include "esp_system.h"
- #include "driver/gpio.h"
-
- #ifdef LV_LCGL_H_INCLUDE_SIMPLE
- #include "lvgl.h"
- #include "demos/lv_demos.h"
- #else
- #include "lvgl/lvgl.h"
- #include "lvgl/demos/lv_demos.h"
- #endif
-
- #include "lvgl_helpers.h"
- #include "esp_timer.h"
- #include "FreeRTOSConfig.h"
-
- #define TAG "demo"
- #define LV_TICK_PERIOD_MS 1
-
- static void lv_tick_task(void *arg);
- static void guiTask(void *pvParameter);
- static void create_demo_application(void);
-
- void app_main(void)
- { //创建一个新的FreeRTOS任务,并将其固定在指定的核心上
- //参数1:任务函数指针
- //参数2:任务名称
- //参数3:任务堆栈大小
- //参数4:传递给任务函数的参数
- //参数5:任务优先级
- //参数6:用于返回任务句柄的指针
- //参数7:指定运行任务的核心,esp32双核
- xTaskCreatePinnedToCore(guiTask,"gui",4096*2,NULL, 0, NULL, 1);
- }
- //创建一个gui信号量来并发处理调用lvgl函数
- SemaphoreHandle_t xGuiSemaphore;
-
- //gui任务函数
- static void guiTask(void *pvParameter)
- {
- (void)pvParameter;
- xGuiSemaphore = xSemaphoreCreateMutex();
-
- lv_init();//初始化lvgl库
-
- lvgl_driver_init();//初始化驱动程序使用的spi或i2c总线
-
- lv_color_t *buf1 =heap_caps_malloc(DISP_BUF_SIZE *sizeof(lv_color_t), MALLOC_CAP_DMA);
- assert(buf1 != NULL);
-
- /*当不使用单色显示时使用双缓冲*/
- #ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME
- lv_color_t *buf2 =heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
- assert(buf2 != NULL);
- #else
- static lv_color_t *buf2 = NULL;
- #endif
- static lv_disp_draw_buf_t disp_buf;
- uint32_t size_in_px = DISP_BUF_SIZE;
- #if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
- size_in_px *=8;
- #endif
- /*根据所选的display.d初始化工作缓冲区
- 注意:使用单色显示时,buf2 == NULL*/
- lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);
-
- lv_disp_drv_t disp_drv;
- lv_disp_drv_init(&disp_drv);
- disp_drv.flush_cb = disp_driver_flush;
-
- /*当使用单色显示时,我们需要注册回调:* - rounder_cb* - set_px_cb */
- #ifdef CONFIG_LV_TFT_DISPLAY_MONOCHROME
- disp_drv.rounder_cb = disp_driver_rounder;
- disp_drv.set_px_cb = disp_driver_set_px;
- #endif
-
- disp_drv.draw_buf = &disp_buf;
- disp_drv.hor_res = LV_HOR_RES_MAX;
- disp_drv.ver_res = LV_VER_RES_MAX;
- lv_disp_drv_register(&disp_drv);
-
- /*注册一个输入设备时,启用菜单配置*/
- #if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE
- lv_indev_drv_t indev_drv;
- lv_indev_drv_init(&indev_drv);
- indev_drv.read_cb =touch_driver_read;
- indev_drv.type = LV_INDEV_TYPE_POINTER;
- lv_indev_drv_register(&indev_drv);
- #endif
- /*创建并启动一个周期定时器中断调用lv_tick_inc */
- const esp_timer_create_args_t periodic_timer_args =
- {
- .callback =&lv_tick_task,
- .name = "periodic_gui",
- };
- esp_timer_handle_t periodic_timer;
- ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args,&periodic_timer));
- ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
-
- create_demo_application();
-
- while(1)
- { /*延迟1个tick(假设freeertos的tick是10ms */
- vTaskDelay(pdMS_TO_TICKS(10));
- /*尝试获取信号量,成功后调用Lvgl相关函数*/
- if(pdTRUE == xSemaphoreTake(xGuiSemaphore, portMAX_DELAY))
- {
- lv_task_handler();
- xSemaphoreGive(xGuiSemaphore);
- }
- }
-
- free(buf1);
- #ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME
- free(buf2);
- #endif
- vTaskDelete(NULL);
- }
-
-
- //创建一个演示应用函数
- static void create_demo_application(void)
- {
- lv_demo_music();
- //lv_demo_widgets();
- }
-
-
-
- //
- static void lv_tick_task(void *arg)
- {
- (void)arg;
-
- lv_tick_inc(LV_TICK_PERIOD_MS);
- }
我们编译的时候遇到了一个错误,就是lv_demo_music没有定义
解决方法:在lvgl/env_support/cmake/esp.cmake中增加${LVGL_ROOT_DIR}/demos/*.c,如图
按如下依次点击
最后保存。按下面修改
编译成功,问题处可以忽略,版本问题
最后下载到开发板发现显示不清晰,是显示缓存大小的问题
只要修改一下lv_helpers.h文件里面的DISP_BUF_SIZE大小即可
最后:如果想要横屏显示,直接将lv_helpers.h文件里的横竖像素对调(水平480,垂直320),再在配置菜单栏里改为横屏landscape,保存编译下载即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。