当前位置: 首页 > news >正文

ESP32 LVGL8.1 M5 Core2 + LVGL + IDF 详细的移植教程 (30)

提示:本博客作为学习笔记,有错误的地方希望指正

文章目录

  • 一、ESP32 LVGL移植(可以更新到最新的版本)移植准备
  • 二、移植修改文件
    • 2.1、报错错中的API修改
    • 2.2、电源芯片初始化
  • 三、下载链接

一、ESP32 LVGL移植(可以更新到最新的版本)移植准备

  移植下载网址:Github,然后需要下载一些文件,其中找到属于lv_port_esp32、lvgl ,lv_demos,lvgl_esp32_drivers四个文件。将lvgl、lvgl_demos、lv_esp32_drivers中的文件复制到components文件中子目录中,之前使用M5Stack移植的时候LVGL的版本是8.1的,现在已经更新到8.3版本了,我最新下载的版本分别是lv_demos-release-v8.1、lvgl-release-v8.3、lvgl_esp32_drivers-master、lv_port_esp32-master。
  这里主要对这几个文件的作用说明下。

  • lv_demos :主要是LVGL的演示示例demo
  • lvgl :主要是lvgl的核心API
  • lvgl_esp32_drivers:主要是lvgl和esp32的接口驱动、iic、spi、触摸初始化、液晶显示初始化。
  • lv_port_esp32 :主要是esp32 移植的框架,上面这三个文件需要放在lv_port_esp32 components文件中/lv_examples、/lvgl、/lvgl_esp32_drivers这三个文件中的。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二、移植修改文件

2.1、报错错中的API修改

  这里的话我使用的是我之前移植的M5Stack的工程来移植的,所以直接使用之前的工程,这样方便快速的移植,这里编译的时候会出现报错。
在这里插入图片描述
  这里主要是由于LVGL8.3的API和LVGL8.1的API有些改变我们找到对应的lv_demo_widgets.c中下面的代码,然后找到lv_obj_draw_part_dsc_t的结构体,发现下面已经将里面的成员变量clip_area改成draw_area,然后我们就在lv_demo_widgets.c中将dsc结构体中变量clip_area改成draw_area,编译即可,这样编译就不会出问题。

lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);

  这时候我们在配置下sdkconfig,lvgl中液晶的io配置和触摸配置。
在这里插入图片描述
在这里插入图片描述

2.2、电源芯片初始化

  最后需要配置下我们M5 Core2的电源芯片,这里主要去配置AXP192的电源配置,AXP192作为M5 Core的电源控制芯片,需要配置,不然初始化lvgl的时候会出现问题。
  其中这里对于AXP192的电源状态的读写我使用了一个巧妙的逻辑运算,因为我们在对寄存器写的时候不能改变这个寄存器的其他状态值,所以我就先将这个寄存器的值读出来,然后再去解析该字的数值,先判断当前值是否已经打开(位设置为1时候认为打开),如果已经打开,当前要设置的state状态是要关闭的话,我先将set_bit按位取反“~”,然后在于0xff按位与“&”,最后将我们读取的值与set_bit按位与“&”,这样的话就可以不改变一个byte中的其他位值,只要改变想要改变的位的值,并且,如果该位已经设置了就不会再重复的设置,没有设置的话就会重新设置。使用两个参数对一个byte中的某个位进行设置。

#include "AXP192.h"
void AXP192_IIC_Write(uint8_t w_register, uint8_t value)
{
    i2c_cmd_handle_t i2c_cmd_handle = i2c_cmd_link_create();
    i2c_master_start(i2c_cmd_handle);
    i2c_master_write_byte(i2c_cmd_handle,AXP192_ADDRESS | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(i2c_cmd_handle,w_register, true);
    i2c_master_write_byte(i2c_cmd_handle,value, true);
    i2c_master_stop(i2c_cmd_handle);
    i2c_master_cmd_begin(I2C_NUM_0,i2c_cmd_handle,pdMS_TO_TICKS(10));
    i2c_cmd_link_delete(i2c_cmd_handle);
}
static void AXP192_IIC_Read(uint8_t r_register, uint8_t *value)
{
    i2c_cmd_handle_t i2c_cmd_handle = i2c_cmd_link_create();
    i2c_master_start(i2c_cmd_handle);
    i2c_master_write_byte(i2c_cmd_handle,AXP192_ADDRESS | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(i2c_cmd_handle,r_register, true);
    i2c_master_start(i2c_cmd_handle);
    i2c_master_write_byte(i2c_cmd_handle,AXP192_ADDRESS | I2C_MASTER_READ, true);
    i2c_master_write_byte(i2c_cmd_handle, value, I2C_MASTER_NACK);
    i2c_master_stop(i2c_cmd_handle);
    i2c_master_cmd_begin(I2C_NUM_0,i2c_cmd_handle,pdMS_TO_TICKS(10));
    i2c_cmd_link_delete(i2c_cmd_handle);
}
static void Axp192_Reg_Set_Bit(uint8_t reg, bool state, uint8_t set_bit)
{
    uint8_t reg_value;
    AXP192_IIC_Read(reg, &reg_value);           //读取寄存器值读出来的值赋给reg_value
    if(reg_value & set_bit){                    //设置前是开启状态
        if(!state){                             //现在关闭
            set_bit = ~set_bit;                 //按位取反
            set_bit &= 0xff;                    // 0101 1111 bit7 与 bit5保留不可变更                   
            reg_value &= set_bit;
            AXP192_IIC_Write(reg,reg_value);    //设置值
        }
    }else{                                      //设置前是关闭状态
        if(state){                              //现在开启
            reg_value |=  set_bit;              //与运算
            AXP192_IIC_Write(reg,reg_value);    //设置值
        }
    }
}
static void AXP192_DC_DC_LDO_Power_Control(Axp192_Power_Control_t channel, Power_Control_State_t state)
{
    Axp192_Reg_Set_Bit(AXP192_REG_POWER_OUTPUT,state,channel);
}

void AXP192_Init(void)
{
    int i2c_master_port = I2C_NUM_0;                //配置IIC端口
    i2c_config_t conf = {
        .mode               = I2C_MODE_MASTER,      //配置IIC模式
        .sda_io_num         = GPIO_NUM_21,          //配置IIC SDA 引脚
        .scl_io_num         = GPIO_NUM_22,          //配置IIC SCL 引脚
        .sda_pullup_en      = GPIO_PULLUP_ENABLE,   //IIC 上拉
        .scl_pullup_en      = GPIO_PULLUP_ENABLE,   //IIC 下拉
        .master.clk_speed   = 40000,                //IIC 速度
    };
    i2c_param_config(i2c_master_port, &conf);       //IIC 配置
    //安装IIC驱动
    ESP_ERROR_CHECK(i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0));

    AXP192_DC_DC_LDO_Power_Control(EXTEN_CONTROL,POWER_CONTROL_ON);     //外部电源开关控制器 控制外部电源5V boast 升压
    AXP192_DC_DC_LDO_Power_Control(DC_DC1_CONTROL,POWER_CONTROL_ON);    //开启DC-DC1通道的电源
    AXP192_DC_DC_LDO_Power_Control(DC_DC3_CONTROL,POWER_CONTROL_ON);    //开启DC-DC3通道的电源
    AXP192_DC_DC_LDO_Power_Control(LDO2_CONTROL,POWER_CONTROL_ON);      //开启LDO2电源
    AXP192_DC_DC_LDO_Power_Control(LDO3_CONTROL,POWER_CONTROL_OFF);     //LDO3是直接开启震动马达的 

    AXP192_IIC_Write(0X27,0X7F);                        //设置背光电压  0X38 0X7F 0X48

    vTaskDelay(10/portTICK_PERIOD_MS);                  //延时
    ESP_ERROR_CHECK(i2c_driver_delete(I2C_NUM_0));      //删除驱动
}
#ifndef _AXP192_H_
#define _AXP192_H_
#include "driver/i2c.h"
#include "esp_log.h"

#define AXP192_ADDRESS              0x68
#define AXP192_REG_POWER_OUTPUT     0x12

//电源开关控制
typedef enum{
    EXTEN_CONTROL  =  0x40,         //外部电源控制
    DC_DC1_CONTROL =  0x01,         //DC-DC1通道控制
    DC_DC2_CONTROL =  0x10,         //DC-DC2通道控制
    DC_DC3_CONTROL =  0x02,         //DC-DC3通道控制
    LDO2_CONTROL   =  0x04,         //LDO2通道控制
    LDO3_CONTROL   =  0x08,         //LDO3通道控制
}Axp192_Power_Control_t;

//控制状态
typedef enum{
    POWER_CONTROL_OFF = 0,
    POWER_CONTROL_ON  = 1,
}Power_Control_State_t;

void AXP192_Init(void);
#endif

  最后编译下载OK,对与LVGL8.1和LVGL8.3我都移植在M5Core2上,对于两个版本的速度的话我这里测试8.1版本的会快些,可能有些配置的差异,这里不做准确的比较,可能是对于esp32demo中添加了一些东西,

三、下载链接

  M5Core2 + LVGL8.1 + LVGL8.3 + IDF

相关文章:

  • 【论文阅读】Search-Based Testing Approach for Deep Reinforcement Learning Agents
  • c++版模板匹配与特征金字塔结构
  • 软件工程和Maven
  • 基于haarlike特征提取和Adaboost 的红绿灯/人行道检测识别matlab仿真
  • React的高阶组件详解
  • Python基础快速入门
  • FigDraw 22. SCI文章中绘图之核密度及山峦图 (ggridges)
  • 并联四足机器人项目开源教程(一)--- 机器人学导论的学习
  • 【CSS】笔记6-精灵图、字体图标
  • 秒懂如何使用SpringBoot+Junit4进行单元测试
  • 【C++】模板进阶 — 模板的特化
  • 11:跨域访问-Java Spring
  • 数据挖掘:降低汽油精制过程中的辛烷值损失模型(二)
  • C++进阶语法(随缘填补...)
  • 不想上班做什么好呢?
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2017届校招提前批面试回顾
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript设计模式系列一:工厂模式
  • java中的hashCode
  • mongo索引构建
  • python学习笔记-类对象的信息
  • Rancher如何对接Ceph-RBD块存储
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 电商搜索引擎的架构设计和性能优化
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 数组大概知多少
  • 原生Ajax
  • (6)STL算法之转换
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (分布式缓存)Redis哨兵
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)jdk与jre的区别
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net mvc 获取url中controller和action
  • .net的socket示例
  • .NET委托:一个关于C#的睡前故事
  • ;号自动换行
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @SuppressWarnings(unchecked)代码的作用
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [ 转载 ] SharePoint 资料
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [hive] posexplode函数
  • [jquery]this触发自身click事件,当前控件向上滑出
  • [OS-Linux] CentOS 7.x 使用密钥登录安全设置
  • [Paper]Application of deep convolutional neural network for automated detection of myocardial...
  • [PHP]严格类型
  • [poj 3461]Oulipo[kmp]