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

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

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

  移植下载网址:Github,然后需要下载一些文件,其中找到属于lv_port_esp32lvgl ,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

猜你喜欢

转载自blog.csdn.net/believe666/article/details/127159316