最近买了个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();
}