最近买了个st7789屏幕,然后我拾起了半年前买的esp32板子,之前用esp32做过一个大模型点歌机,后面就没碰过了。

暑假学习了lvgl,研究一下lvgl在esp32上的使用

led

#include "driver/rmt_tx.h"
#include "led_strip.h" 
 // LED Strip 配置
    led_strip_config_t strip_config = {
        .strip_gpio_num = GPIO_NUM_48,
        .max_leds = 1, // 只有一个LED
    };

    led_strip_rmt_config_t rmt_config = {
        .resolution_hz = 10000000, // 10MHz
    };

    led_strip_handle_t led_strip = NULL;
    ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));

lvgl for esp

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include <esp_lvgl_port.h>
#include <esp_lcd_panel_dev.h>
#include <lvgl.h>
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_panel_vendor.h"

// 屏幕相关数据
#define DISP_WIDTH 240
#define DISP_HEIGHT 300
#define DISP_BUF_LINES 40 // 控制局部绘制缓存区,一次绘制40行
#define LCD_SCK 41        // SCL
#define LCD_MOSI 40       // SDA/MOSI
#define LCD_RST 39        // RES
#define LCD_DC 38         // DC
#define LCD_CS 37         // CS

void app_main(void)
{
    const lvgl_port_cfg_t lvgl_cfg = ESP_LVGL_PORT_INIT_CONFIG();
    ESP_ERROR_CHECK(lvgl_port_init(&lvgl_cfg));

    // 初始化SPI总线
    spi_bus_config_t buscfg = {
        .sclk_io_num = LCD_SCK,
        .mosi_io_num = LCD_MOSI,
        .miso_io_num = -1, // 不用的要设置为-1
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
        .max_transfer_sz = DISP_WIDTH * DISP_HEIGHT * 2 + 8,
    };
    ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO));

    // 创建io_handle lcd句柄,并且配置相关引脚
    esp_lcd_panel_io_handle_t io_handle = NULL;
    esp_lcd_panel_io_spi_config_t io_config = {
        .cs_gpio_num = LCD_CS, // CS引脚
        .dc_gpio_num = LCD_DC, // DC引脚
        .spi_mode = 0,
        .pclk_hz = 80 * 1000 * 1000,
        .trans_queue_depth = 10,
        .on_color_trans_done = NULL,
        .user_ctx = NULL,
        .lcd_cmd_bits = 8,
        .lcd_param_bits = 8,
    };
    ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &io_handle));

    // 创建LCD面板句柄
    esp_lcd_panel_handle_t lcd_panel_handle;
    esp_lcd_panel_dev_config_t panel_config = {
        .reset_gpio_num = LCD_RST,
        .color_space = ESP_LCD_COLOR_SPACE_RGB,
        .bits_per_pixel = 16,
        .vendor_config = NULL,
    };
    ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &lcd_panel_handle)); // 指定创建ST7789面板
    ESP_ERROR_CHECK(esp_lcd_panel_reset(lcd_panel_handle));                                 // 重置面板
    ESP_ERROR_CHECK(esp_lcd_panel_init(lcd_panel_handle));                                  // 初始化面板
    ESP_ERROR_CHECK(esp_lcd_panel_invert_color(lcd_panel_handle, true));                    // 不知道为何屏幕显示是反色的,反转颜色才能正常显示
    ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(lcd_panel_handle, true));                     // 打开显示

    // 配置lvgl
    const lvgl_port_display_cfg_t disp_cfg = {
        .io_handle = io_handle,
        .panel_handle = lcd_panel_handle,
        .buffer_size = DISP_WIDTH * DISP_BUF_LINES * 2, // 乘以2因为RGB565是16位
        .double_buffer = true,
        .hres = DISP_WIDTH,
        .vres = DISP_HEIGHT,
        .monochrome = false,
        .color_format = LV_COLOR_FORMAT_RGB565,
        .rotation = {
            .swap_xy = false,
            .mirror_x = false,
            .mirror_y = false,
        },
        .flags = {
            .buff_dma = true,
            .swap_bytes = true, // ST7789通常需要交换字节序
        }};
    lv_disp_t *disp_handle = lvgl_port_add_disp(&disp_cfg);

    lvgl_port_lock(0);
    lv_obj_t *btn = lv_btn_create(lv_scr_act());
    lv_obj_t *btn_title = lv_label_create(btn);
    lv_label_set_text(btn_title, "Hello LVGL");
    lv_obj_center(btn_title);
    lv_obj_set_size(btn, 100, 50);
    lv_obj_center(btn);
    lvgl_port_unlock();
}