提示:本博客作为学习笔记,有错误的地方希望指正
一、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, ®_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中添加了一些东西,