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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的Qt程序,它使用FreeRDP 2.9库连接到远程Windows机器。这个程序创建一个窗口,在窗口中显示远程机器的桌面。 ```cpp #include <QtCore> #include <QtGui> #include <QApplication> #include <QMainWindow> #include <QHBoxLayout> #include <freerdp/client.h> #include <freerdp/version.h> class RdpClient : public QMainWindow { Q_OBJECT public: RdpClient(QWidget *parent = 0); ~RdpClient(); void start(); void stop(); protected: void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); private: freerdp *rdp; QPixmap pixmap; }; RdpClient::RdpClient(QWidget *parent) : QMainWindow(parent) { QPalette palette = this->palette(); palette.setColor(QPalette::Window, Qt::black); this->setPalette(palette); this->setWindowTitle("RdpClient"); QHBoxLayout *layout = new QHBoxLayout(this); QWidget *centralWidget = new QWidget(this); centralWidget->setLayout(layout); this->setCentralWidget(centralWidget); } RdpClient::~RdpClient() { stop(); } void RdpClient::start() { rdp = freerdp_new(); rdp->settings->hostname = "192.168.1.100"; rdp->settings->port = 3389; rdp->settings->username = "user"; rdp->settings->password = "password"; rdp->settings->width = this->width(); rdp->settings->height = this->height(); rdp->settings->color_depth = 24; rdp->settings->performance_flags |= PERF_ENABLE_FONT_SMOOTHING; rdp->settings->performance_flags |= PERF_ENABLE_DESKTOP_COMPOSITION; rdp->settings->performance_flags |= PERF_ENABLE_MENU_ANIMATIONS; rdp->settings->performance_flags |= PERF_ENABLE_THEMING; freerdp_context *context; context = freerdp_context_new(freerdp); freerdp_context_set_pixel_format(context, PIXEL_FORMAT_XRGB32); freerdp_set_context_callback(rdp, (pContextNew)freerdp_context_new); freerdp_set_context_callback(rdp, (pContextFree)freerdp_context_free); freerdp_set_context(rdp, context); freerdp_connect(rdp); while (rdp->connected) { freerdp_get_event(rdp->instance); } } void RdpClient::stop() { freerdp_disconnect(rdp); freerdp_free(rdp); rdp = NULL; } void RdpClient::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawPixmap(0, 0, pixmap); } void RdpClient::resizeEvent(QResizeEvent *event) { rdp->settings->width = this->width(); rdp->settings->height = this->height(); } int main(int argc, char *argv[]) { QApplication app(argc, argv); RdpClient rdpClient; rdpClient.setMinimumSize(800, 600); rdpClient.show(); rdpClient.start(); return app.exec(); } ``` 请注意,您需要在Qt项目的.pro文件中添加以下内容,以将FreeRDP库链接到您的应用程序中: ``` LIBS += -lfreerdp-client2 \ -lfreerdp-core2 \ -lfreerdp-gdi2 \ -lfreerdp-rail2 \ -lfreerdp-utils2 ``` 希望这可以帮助您开始使用Qt和FreeRDP 2.9。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值