ESP32开发路程LVGL篇(一)——移植完整过程,花屏问题解决,ST7735显示方向

2023-10-29


LVGL官方文档:文档链接
本文使用屏幕:ST7735(1.8寸,分辨率128*160)
本文使用框架:ESP-IDF(VSCODE)

移植

准备工作

下载 lvgl (注意是v7版本,v8暂不适配):
https://github.com/lvgl/lvgl/tree/release/v7
下载 lvgl_esp32_drivers(master 分支):
https://github.com/lvgl/lvgl_esp32_drivers/tree/master

开始移植

  • 创建新项目
    新手可以参考 这一篇文章 里面的 常用操作 -> 自己创建工程

  • 创建 components
    新建 components 文件夹,并将准备工作中下载的 lvgl 和 lvgl_esp32_drivers 移入该文件夹中,创建结果应与下图相符合

在这里插入图片描述

  • 添加 SPI_HOST_MAX 定义
    在 lvgl_esp32_drivers 里的 lvgl_helpers.h 里面的合适位置添加 SPI_HOST_MAX 定义
#define SPI_HOST_MAX 3
  • 在 menuconfig 里面进行相关配置
    !!!这一环节很重要,一步没注意就会导致屏幕显示异常
    • LVGL configuration
      在此处修改屏幕分辨率(128*160为例),勾选 Swap 这一选项
      在这里插入图片描述
    • LVGL TFT Display controller
      Display orientation 可以更改屏幕显示方向,controller model 选择ST7735S,勾选 Use custom SPI clock frequency 我的设置为10MHz
      在这里插入图片描述
    • Display Pin Assignments
      这里的引脚设置可以自定义,以下仅作参考,Backlight Control 可有可无,不用时选择 Not Used
      在这里插入图片描述
  • 修改驱动代码
    在 lvgl_esp32_drivers -> lvgl_tft 里的 st7735s.h 文件里 修改以下定义,COLSTART 和 ROWSTART 的值需要根据所用的屏幕分辨率进行调整,本文所用的128*160,应将两者设置为0
#define COLSTART            0
#define ROWSTART            0

编译运行

  • 添加 main.c 代码
    给出一段测试代码(lv_port_esp32 工程中删减的 main.c 代码),运行效果为白底黑字显示“Hello world”,关于代码的讲解放在下一篇去介绍。
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_freertos_hooks.h"
#include "freertos/semphr.h"
#include "esp_system.h"
#include "driver/gpio.h"

/* Littlevgl specific */
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif

#include "lvgl_helpers.h"

/*********************
 *      DEFINES
 *********************/
#define TAG "demo"
#define LV_TICK_PERIOD_MS 1

/**********************
 *  STATIC PROTOTYPES
 **********************/
static void lv_tick_task(void *arg);
static void guiTask(void *pvParameter);
static void create_demo_application(void);

/**********************
 *   APPLICATION MAIN
 **********************/
void app_main() {

    /* If you want to use a task to create the graphic, you NEED to create a Pinned task
     * Otherwise there can be problem such as memory corruption and so on.
     * NOTE: When not using Wi-Fi nor Bluetooth you can pin the guiTask to core 0 */
    xTaskCreatePinnedToCore(guiTask, "gui", 4096*2, NULL, 0, NULL, 1);
}

/* Creates a semaphore to handle concurrent call to lvgl stuff
 * If you wish to call *any* lvgl function from other threads/tasks
 * you should lock on the very same semaphore! */
SemaphoreHandle_t xGuiSemaphore;

static void guiTask(void *pvParameter) {

    (void) pvParameter;
    xGuiSemaphore = xSemaphoreCreateMutex();

    lv_init();

    /* Initialize SPI or I2C bus used by the drivers */
    lvgl_driver_init();

    lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
    assert(buf1 != NULL);

    /* Use double buffered when not working with monochrome displays */
    lv_color_t* buf2 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
    assert(buf2 != NULL);

    static lv_disp_buf_t disp_buf;

    uint32_t size_in_px = DISP_BUF_SIZE;

    /* Initialize the working buffer depending on the selected display.
     * NOTE: buf2 == NULL when using monochrome displays. */
    lv_disp_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;

#if defined CONFIG_DISPLAY_ORIENTATION_PORTRAIT || defined CONFIG_DISPLAY_ORIENTATION_PORTRAIT_INVERTED
    disp_drv.rotated = 1;
#endif

    disp_drv.buffer = &disp_buf;
    lv_disp_drv_register(&disp_drv);

    /* Create and start a periodic timer interrupt to call 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 the demo application */
    create_demo_application();

    while (1) {
        /* Delay 1 tick (assumes FreeRTOS tick is 10ms */
        vTaskDelay(pdMS_TO_TICKS(10));

        /* Try to take the semaphore, call lvgl related function on success */
        if (pdTRUE == xSemaphoreTake(xGuiSemaphore, portMAX_DELAY)) {
            lv_task_handler();
            xSemaphoreGive(xGuiSemaphore);
       }
    }

    /* A task should NEVER return */
    free(buf1);
#ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME
    free(buf2);
#endif
    vTaskDelete(NULL);
}

static void create_demo_application(void)
{
    /* When using a monochrome display we only show "Hello World" centered on the
     * screen */

    /* use a pretty small demo for monochrome displays */
    /* Get the current screen  */
    lv_obj_t * scr = lv_disp_get_scr_act(NULL);

    /*Create a Label on the currently active screen*/
    lv_obj_t * label1 =  lv_label_create(scr, NULL);

    /*Modify the Label's text*/
    lv_label_set_text(label1, "Hello\nworld");

    /* Align the Label to the center
     * NULL means align on parent (which is the screen now)
     * 0, 0 at the end means an x, y offset after alignment*/
    lv_obj_align(label1, NULL, LV_ALIGN_CENTER, 0, 0);
}

static void lv_tick_task(void *arg) {
    (void) arg;

    lv_tick_inc(LV_TICK_PERIOD_MS);
}

  • 编译运行
    ESP32 与 TFT 的引脚连接参考如下,编译成功的话,将代码烧录到 ESP32 中
ESP32 TFT 本文使用引脚
MOSI SDA 23
CLK SCL 18
CS CS 19
DC DC 21
RST RST 22
  • 结果展示

在这里插入图片描述

花屏问题

  • 检查分辨率设置
    • 在 lvgl_helpers.h 中通过修改 LV_HOR_RES_MAX 和 LV_VER_RES_MAX 的值来设置显示器的像素宽度和高度可能是没有作用的,应该在 menuconfig -> LVGL configuration 里面设置
    • 同时要注意 horizontal 和 vertical 的值不要写颠倒了,可以尝试调换两个值的所处位置
  • 调整 SPI 频率
    • 可以在 menuconfig -> LVGL TFT Display controller 里面调整 SPI 频率,我设置的频率是10MHz

ST7735显示方向

目前使用的驱动,可以支持的 ST7735 显示方向只有 Portrait (竖屏)和 Landscape (横屏)。

要想将显示方向调整为 Portrait inverted 和 Landscape inverted 的话,需要修改 lvgl_esp32_drivers -> lvgl_tft 里的 st7735s.c 文件

找到文件里的 st7735s_set_orientation 函数,并将其替换成如下所示

static void st7735s_set_orientation(uint8_t orientation)
{
    const char *orientation_str[] = {
        "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
    };

    ESP_LOGD(TAG, "Display orientation: %s", orientation_str[orientation]);

    /*
        Portrait:  0xC8 = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_BGR
		Portrait inverted: 0x08
        Landscape: 0xA8 = ST77XX_MADCTL_MY | ST77XX_MADCTL_MV | ST77XX_MADCTL_BGR
		Landscape inverted: 0x78
    */
    uint8_t data[] = {0xC8, 0x08, 0xA8, 0x78};

    ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]);

    st7735s_send_cmd(ST7735_MADCTL);
    st7735s_send_data((void *) &data[orientation], 1);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32开发路程LVGL篇(一)——移植完整过程,花屏问题解决,ST7735显示方向 的相关文章

  • 第四阶段07-基于element-ui的vue2.0脚手架

    35 创建VUE脚手架项目 参考 VUE Cli课前准备 软件安装篇 pdf 36 关于VUE脚手架项目 VUE脚手架项目是一个 单页面 应用 即整个项目中只有1个网页 在VUE脚手架项目中 主要是设计各个 视图组件 它们都是整个网页中某个
  • 概率论与数理统计基础概念与重要定义汇总

    文章目录 一 随机事件和概率 1 互斥 对立 独立事件的定义和性质 2 概率 条件概率和五大概率公式 3 古典型 几何型概率和伯努利试验 4 易错问题汇总 二 随机变量及其分布 1 随机变量及其分布函数 2 常用分布 三 多维随机变量及其分
  • vscode 绑定已有的python环境

    vscode 绑定已有的python环境 先选择左下角那个 然后把这个python点击安装一下 回到程序文件页面 点开一个空的程序页面 同时按下ctrl shift P 弹出下拉框 在下拉框的搜索框输入select Interpreter

随机推荐

  • SpringFox 3尝鲜 集成SpringBoot生成Swagger接口文档

    SpringFox简介 SpringFox 是一个开源的API Doc的框架 它的前身是swagger springmvc 可以将我们的Controller中的方法以文档的形式展现 官方定义为 Automated JSON API docu
  • C++基础知识 - 优先级队列priority_queue

    优先级队列 priority queue 优先队列 它的入队顺序没有变化 但是出队的顺序是根据优先级的高低来决定的 优先级高的优先出队 最大值优先级队列 最小值优先级队列 用来开发一些特殊的应用 include lt queue gt pr
  • [创业之路-75] - 感悟 - 什么样的老板不值得长期跟谁?

    目录 1 只画饼没有实际行动的老板 靠骗人 2 内心不尊重员工的老板 太虚假 3 没有规划的老板 无计划 4 经常会承诺不兑现的老板 轻承诺 5 时常对陌生人忽悠的老板 无信誉 6 经常会承诺别人的老板 轻承诺 7 企业经营多年没把企业做大
  • URL路径 /** /* /?的含义

    匹配任意多级路径如 aa bb cc 仅可匹配一级路径如 aa 仅可匹配一级路径且最多只有一个字符 如 a
  • Webpack loader

    loader 概念 官网对 loader 的解释是这样的 webpack 只能理解 JavaScript 和 JSON 文件 这是 webpack 开箱可用的自带能力 loader 让 webpack 能够去处理其他类型的文件 并将它们转换
  • HDFS巡检、监控、调优、排障

    1 巡检 HDFS 为集群提供高可用性弹性存储服务 是集群的存储主体 每日早晚巡检HDFS 服务 包括HDFS 服务可用性 存储使用率 datanode 是否有故障盘等 1 1 HDFS 总体状态 HDFS 状态 如下的红色提示需要关注 H
  • 前端实现亚马逊AWS s3的跨域问题总结

    在s3控制台中添加存储桶并设置 跨域配置 测试环境直接开放 请求 不然会跨域
  • 基于Lending Club的数据分析实战项目【小白记录向】【二】

    本实战项目基于Lending Club的数据集 数据集地址 https github com H Freax lendingclub analyse 本实战项目基于Colab环境 文章目录 简介 使用机器学习方法进行解决 数据准备 机器学习
  • python 运算符

    python 运算符有基础运算符 赋值运算符 比较运算符 逻辑运算符 成员运算符和身份运算符 今天我们就来了解一下吧 基础运算符 赋值运算符 比较运算符 比较运算符也称关系运算符 运算符 lt gt 仅适用于 Python2 作用等同于 P
  • LLM论文周报|来自谷歌、Meta AI、香港中文大学等机构前沿论文研究

    大模型 LLM 是一种人工智能模型 旨在理解和生成人类语言 它们在大量的文本数据上进行训练 可以执行广泛的任务 包括文本总结 翻译 情感分析等等 LLM的特点是规模庞大 包含数十亿的参数 帮助它们学习语言数据中的复杂模式 这些模型通常基于深
  • 小白谈memcache和memcached的区别

    http www cnblogs com scotoma archive 2011 02 15 1955573 html 用了段时间的memcache和memcached总结下认识 看很多人在用cache的时候 刚刚都没有搞清楚memcac
  • Vue基础--基本语法

    一 介绍 1 Vue js 是什么 2 初识Vue js 二 基本语法 1 基本数据渲染和指令 2 双向数据绑定 3 事件 4 修饰符 5 条件渲染 6 列表渲染 7 计算属性 一 介绍 1 Vue js 是什么 Vue 读音 vju 类似
  • <微机原理>[汇编语言]-[实验八]矩阵键盘应用实验

    实验八 矩阵键盘应用实验 实验八 矩阵键盘应用实验 doc 一 实验目的 掌握矩阵式键盘识别技术 进一步掌握数码管显示原理 二 实验主要仪器和环境 Keil5 普中A2开发板 stc isp 三 实验内容 用单片机的并行口P1接矩阵键盘 在
  • 亲爱的友友们,有在运行detection测试时,遇到“找不到指定模块的问题”吗?

    我的MMdertection是安装的CPU版本的 因为没有独立显卡 救救孩子吧
  • 10分钟搞定miniconda-python环境安装

    windows配置python环境 每次到一个新电脑就要安装环境 很多包安装起来很麻烦 下面对安装地址和常规使用包做了总结 一键安装所有包不用再一个一个找了 所有问题10分钟搞定 1 安装Miniconda 可在清华大学开源软件镜像站下载安
  • Wordpress 安装,文件夹权限设置

    wordpress 权限对安装和使用效果的影响很大 权限错误将影响theme的安装 不能安装theme或者修改theme或删除theme 相关设置 chmod 755 wordpress find wordpress type d exec
  • DTS高管Roy Law:智能手机是重点发展方向

    2012年初 DTS公司宣布将收购SRS实验室 引发业界轰动 外界分析称 本次收购将加速实现DTS研发更先进的 功能完整的集成音频解决套件的策略 包括从语音处理技术至混音技术 两者强强结合之后 将对杜比公司发起有力挑战 产业整合趋势也逐渐显
  • diffing算法以及key值的作用

    在react vue中key有什么作用 内部原理是什么 一 虚拟dom中key的作用 简单的来说key就是虚拟dom对象中的标识 在更新显示时key有很重要的作用 原理 当状态中的数据发生改变的时候 react会根据 新数据 生成新的虚拟d
  • 内部泄漏,惊现BAT互联网大厂薪资和职级表,你离年薪40W还差多少

    互联网大厂新入职员工各职级薪资对应表 技术线 上面的表格不排除有很极端的收入情况 但至少能囊括一部分同职级的收入 这个表是 技术线 新入职员工的职级和薪资情况 非技术线 如产品 运营 销售等 以及老员工的情况会和图中的范围有所出入 以校招生
  • ESP32开发路程LVGL篇(一)——移植完整过程,花屏问题解决,ST7735显示方向

    目录 移植 准备工作 开始移植 编译运行 花屏问题 ST7735显示方向 LVGL官方文档 文档链接 本文使用屏幕 ST7735 1 8寸 分辨率128 160 本文使用框架 ESP IDF VSCODE 移植 准备工作 下载 lvgl 注