当前位置:   article > 正文

ESP32-S3-DevKitC-1移植LVGL(3.5寸TFT ILI9488)显示music-play-demo_config_lv_tft_display_controller_ili9488

config_lv_tft_display_controller_ili9488

前期准备:IDF 4.4  + vscode  + 3.5寸SPI  TFT-LCD显示屏(我的驱动器是ILI9488,无触控)

一、创建一个工程

①在vscode里面创建

②然后按照如下步骤依次填好

③选择ESP_IDF

④我们现在idf里面的一个工程案例sample_project,然后创建

⑤点击YES

⑥依次点击,确保编译无错误并且编译通过

二、向工程移植LVGL库和驱动库lvgl_esp32_drivers

①在工程文件夹下新建一个conponents文件夹。

方法一:直接在工程文件夹下新建文件夹,并命名为components

方法二:使用命令指令进行创建。执行命令 mkdir components 创建一个components的文件夹

②向文件夹加入lvgl和lvgl_esp32_driver库

这里同样通过指令拉取。首先输入指令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

三、文件修改

重新打开工程,这时候主函数还没有编写,先编译编译,保证编译通过再编写主函数。

(编译时会有错误提示。我这里是修改好的,跟着错误提示修改即可)

①打开components/lvgl_esp32_drivers里的lvgl_helpers.h文件。添加如下指令

②打开文件夹lvgl并找到lv_conf_template.h。复制粘贴到和lvgl同级文件夹下,如下图。

③重命名为lv_conf.h

④打开命名后的lv_conf.h,按下面修改

⑤更改lv_helper.c文件

⑥添加主函数

main.c

  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "freertos/FreeRTOS.h"
  6. #include "freertos/task.h"
  7. #include "freertos/semphr.h"
  8. #include "esp_system.h"
  9. #include "driver/gpio.h"
  10. #ifdef LV_LCGL_H_INCLUDE_SIMPLE
  11. #include "lvgl.h"
  12. #include "demos/lv_demos.h"
  13. #else
  14. #include "lvgl/lvgl.h"
  15. #include "lvgl/demos/lv_demos.h"
  16. #endif
  17. #include "lvgl_helpers.h"
  18. #include "esp_timer.h"
  19. #include "FreeRTOSConfig.h"
  20. #define TAG "demo"
  21. #define LV_TICK_PERIOD_MS 1
  22. static void lv_tick_task(void *arg);
  23. static void guiTask(void *pvParameter);
  24. static void create_demo_application(void);
  25. void app_main(void)
  26. { //创建一个新的FreeRTOS任务,并将其固定在指定的核心上
  27. //参数1:任务函数指针
  28. //参数2:任务名称
  29. //参数3:任务堆栈大小
  30. //参数4:传递给任务函数的参数
  31. //参数5:任务优先级
  32. //参数6:用于返回任务句柄的指针
  33. //参数7:指定运行任务的核心,esp32双核
  34. xTaskCreatePinnedToCore(guiTask,"gui",4096*2,NULL, 0, NULL, 1);
  35. }
  36. //创建一个gui信号量来并发处理调用lvgl函数
  37. SemaphoreHandle_t xGuiSemaphore;
  38. //gui任务函数
  39. static void guiTask(void *pvParameter)
  40. {
  41. (void)pvParameter;
  42. xGuiSemaphore = xSemaphoreCreateMutex();
  43. lv_init();//初始化lvgl库
  44. lvgl_driver_init();//初始化驱动程序使用的spi或i2c总线
  45. lv_color_t *buf1 =heap_caps_malloc(DISP_BUF_SIZE *sizeof(lv_color_t), MALLOC_CAP_DMA);
  46. assert(buf1 != NULL);
  47. /*当不使用单色显示时使用双缓冲*/
  48. #ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME
  49. lv_color_t *buf2 =heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
  50. assert(buf2 != NULL);
  51. #else
  52. static lv_color_t *buf2 = NULL;
  53. #endif
  54. static lv_disp_draw_buf_t disp_buf;
  55. uint32_t size_in_px = DISP_BUF_SIZE;
  56. #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
  57. size_in_px *=8;
  58. #endif
  59. /*根据所选的display.d初始化工作缓冲区
  60. 注意:使用单色显示时,buf2 == NULL*/
  61. lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);
  62. lv_disp_drv_t disp_drv;
  63. lv_disp_drv_init(&disp_drv);
  64. disp_drv.flush_cb = disp_driver_flush;
  65. /*当使用单色显示时,我们需要注册回调:* - rounder_cb* - set_px_cb */
  66. #ifdef CONFIG_LV_TFT_DISPLAY_MONOCHROME
  67. disp_drv.rounder_cb = disp_driver_rounder;
  68. disp_drv.set_px_cb = disp_driver_set_px;
  69. #endif
  70. disp_drv.draw_buf = &disp_buf;
  71. disp_drv.hor_res = LV_HOR_RES_MAX;
  72. disp_drv.ver_res = LV_VER_RES_MAX;
  73. lv_disp_drv_register(&disp_drv);
  74. /*注册一个输入设备时,启用菜单配置*/
  75. #if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE
  76. lv_indev_drv_t indev_drv;
  77. lv_indev_drv_init(&indev_drv);
  78. indev_drv.read_cb =touch_driver_read;
  79. indev_drv.type = LV_INDEV_TYPE_POINTER;
  80. lv_indev_drv_register(&indev_drv);
  81. #endif
  82. /*创建并启动一个周期定时器中断调用lv_tick_inc */
  83. const esp_timer_create_args_t periodic_timer_args =
  84. {
  85. .callback =&lv_tick_task,
  86. .name = "periodic_gui",
  87. };
  88. esp_timer_handle_t periodic_timer;
  89. ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args,&periodic_timer));
  90. ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
  91. create_demo_application();
  92. while(1)
  93. { /*延迟1个tick(假设freeertos的tick是10ms */
  94. vTaskDelay(pdMS_TO_TICKS(10));
  95. /*尝试获取信号量,成功后调用Lvgl相关函数*/
  96. if(pdTRUE == xSemaphoreTake(xGuiSemaphore, portMAX_DELAY))
  97. {
  98. lv_task_handler();
  99. xSemaphoreGive(xGuiSemaphore);
  100. }
  101. }
  102. free(buf1);
  103. #ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME
  104. free(buf2);
  105. #endif
  106. vTaskDelete(NULL);
  107. }
  108. //创建一个演示应用函数
  109. static void create_demo_application(void)
  110. {
  111. lv_demo_music();
  112. //lv_demo_widgets();
  113. }
  114. //
  115. static void lv_tick_task(void *arg)
  116. {
  117. (void)arg;
  118. lv_tick_inc(LV_TICK_PERIOD_MS);
  119. }

⑦先编译,再配置选项

我们编译的时候遇到了一个错误,就是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,保存编译下载即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/398316
推荐阅读
相关标签
  

闽ICP备14008679号