系列文章目录
前言
第一次使用lvgl做ui,屏幕类的外设之前也鲜有使用,所以也讲不出个一二三四的原理来,只是站在前辈们的肩膀上摸索一下。本系列文章基于ESP32系列ESP-IDF框架下对lcd屏和lvgl的使用,仅用于笔者使用过程记录和参考,如果在使用过程中遇到了一些问题也会提出来希望各路大神不吝赐教。
一、LCD硬件
本人手中有一块ESP32S3-WROOM的开发板(8MBflash+2MBpsram)以及240*320大小、16 bit 色深的TFT屏幕两块。LCD屏幕使用的控制器都是ST7789,但接口略有不同,一块为SPI接口,一块为8080接口,下面为lcd的引脚描述:
SPI:
LCD | ESP32S3 |
GND | GND |
VCC | 3v3 |
SCL | 13(PCLK) |
SDA | 12(MOSI) |
RST | 11(不使用填-1) |
DC | 10 |
CS | 9 |
BL | 46 |
8080:
这里讲一下8080接口接线:
1,2为背光灯控制,1为背光灯阴极,直接接地,2为阳极,接esp32s3的io;电源只需接4脚3.3v;7、8、9、10分别接入esp32s3对应io,11脚RD最好接3.3v拉高(看其它帖子说RD浮空会导致花屏);同时笔者由于初次接线时没有注意到12-19引脚对应的是D7-D0导致数据线12对应到了D0,因此这一点也需格外注意。
二、点屏代码
由于是初次点屏,因此先从IDF里的example/peripherals/lcd示例走起,spi接口先跑tjpgd示例,8080接口跑i80_controller示例。如果idf里没有这个示例,可以先升级一下IDF版本,当然也可以直接跑lvgl示例。
以下仅展示例程中的代码修改部分:
spi接口:
1.修改对应引脚io和屏幕大小:
#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 1
#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL
// #define EXAMPLE_PIN_NUM_DATA0 23 /*!< for 1-line SPI, this also refereed as MOSI */
// #define EXAMPLE_PIN_NUM_PCLK 19
// #define EXAMPLE_PIN_NUM_CS 22
// #define EXAMPLE_PIN_NUM_DC 21
// #define EXAMPLE_PIN_NUM_RST 18
// #define EXAMPLE_PIN_NUM_BK_LIGHT 5
#define EXAMPLE_PIN_NUM_PCLK 13 //SCL
#define EXAMPLE_PIN_NUM_DATA0 12 /*!< for 1-line SPI, this also refereed as MOSI */ //SDA
#define EXAMPLE_PIN_NUM_RST 11
#define EXAMPLE_PIN_NUM_DC 10
#define EXAMPLE_PIN_NUM_CS 9
#define EXAMPLE_PIN_NUM_BK_LIGHT 46
2,设置芯片类型及menuconfig参数配置:开启psram支持,速率为80M
3.编译和烧录查看运行效果:
屏幕不亮的话修改背光电平。
8080接口:
1.修改对应引脚io和屏幕大小:
#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 1
#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL
#define EXAMPLE_PIN_NUM_DATA0 36 //19
#define EXAMPLE_PIN_NUM_DATA1 16
#define EXAMPLE_PIN_NUM_DATA2 37
#define EXAMPLE_PIN_NUM_DATA3 15
#define EXAMPLE_PIN_NUM_DATA4 38
#define EXAMPLE_PIN_NUM_DATA5 7
#define EXAMPLE_PIN_NUM_DATA6 39 //13
#define EXAMPLE_PIN_NUM_DATA7 6 //12
#define EXAMPLE_PIN_NUM_CS 42 //7
#define EXAMPLE_PIN_NUM_RST 4 //8
#define EXAMPLE_PIN_NUM_DC 41 //RS(9)
#define EXAMPLE_PIN_NUM_PCLK 5 //WR(10)
#define EXAMPLE_PIN_NUM_BK_LIGHT 20
// The pixel number in horizontal and vertical
#define EXAMPLE_LCD_H_RES 240
#define EXAMPLE_LCD_V_RES 320
2,设置芯片类型及menuconfig参数配置:开启psram支持,速率为80M
idf.py set-target esp32s3
idf.py menuconfig
3.编译和烧录查看运行效果:
有花屏且图标颜色不对。
4.问题解决
关于颜色不对的问题我一开始参照其它帖子在lvgl里设置颜色交换,但未解决问题。
后来查找代码,在esp_lcd_panel_dev_config_t 配置中将LCD_RGB_ENDIAN_RGB换成LCD_RGB_ENDIAN_BGR,图标从蓝色变成了黄色,但还是不对。最终在查找花屏原因的时候看到了这两行代码:
// Set inversion, x/y coordinate order, x/y mirror according to your LCD module spec
// the gap is LCD panel specific, even panels with the same driver IC, can have different gap value
esp_lcd_panel_invert_color(panel_handle, true);
esp_lcd_panel_set_gap(panel_handle, 0, 20);
发现这是进行颜色交换和设置屏幕间隙的API,将颜色交换改为false,间隙改为0,demo终于正常
演示。
esp_lcd_panel_invert_color(panel_handle, false);
esp_lcd_panel_set_gap(panel_handle, 0, 0);
显示效果(红色横杠为屏幕硬件上有条纹):
三、其它问题
1.之前使用另一款不带psram的esp32开发板通过8080驱动屏幕时屏幕一直处于花屏状态。因此暂不清除该现象是否与硬件有关。
,
总结
对lcd驱动的spi接口和8080接口只能说各有各的好处,目前笔者对此暂时理解不深,也就不多妄言,下次有机会再深入探讨。