ESP32S3+HX8347+3线SPI运行LVGL例程

一、clone lv_port_esp32到本地

git clone https://github.com/lvgl/lv_port_esp32.git

 二、增加hx8347.c、hx8347.h

        components\lvgl_esp32_drivers\lvgl_tft下新增2个文件:hx8347.c、hx8347.h。因为lv_port_esp32中没有hx8347的驱动,需要自己写。这两个hx8347.c、hx8347.h修改HX8357的配置文件改的,有很多冗余信息,不影响使用。

hx8347.h

/*** @file HX8347.h** Roughly based on the Adafruit_HX8347_Library** This library should work with:* Adafruit 3.5" TFT 320x480 + Touchscreen Breakout*    http://www.adafruit.com/products/2050** Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers*    https://www.adafruit.com/product/3651**/#ifndef HX8347_H
#define HX8347_H#ifdef __cplusplus
extern "C" {
#endif/**********************      INCLUDES*********************/
#include <stdbool.h>
#include <stdint.h>#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"/**********************      DEFINES*********************/
#define HX8347_DC   CONFIG_LV_DISP_PIN_DC
#define HX8347_RST  CONFIG_LV_DISP_PIN_RST
#define HX8347_BCKL CONFIG_LV_DISP_PIN_BCKL
#define HX8347_CS   6//CONFIG_LV_DISP_SPI_CS#define HX8347_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#define HX8347_INVERT_COLORS            CONFIG_LV_INVERT_COLORS#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL#define HX8347_BCKL_ACTIVE_LVL 1
#else#define HX8347_BCKL_ACTIVE_LVL 0
#endif/******************** HX8347B/D REGS
*********************/
#define HX8347D                    0xD  ///< Our internal const for D type
#define HX8347B                    0xB  ///< Our internal const for B type#define HX8347_TFTWIDTH            320  ///< 320 pixels wide
#define HX8347_TFTHEIGHT           240  ///< 480 pixels tall#define HX8347_NOP                0x00  ///< No op
#define HX8347_SWRESET            0x01  ///< software reset
#define HX8347_RDDID              0x04  ///< Read ID
#define HX8347_RDDST              0x09  ///< (unknown)#define HX8347_RDPOWMODE          0x0A  ///< Read power mode Read power mode
#define HX8347_RDMADCTL           0x0B  ///< Read MADCTL
#define HX8347_RDCOLMOD           0x0C  ///< Column entry mode
#define HX8347_RDDIM              0x0D  ///< Read display image mode
#define HX8347_RDDSDR             0x0F  ///< Read dosplay signal mode#define HX8347_SLPIN              0x10  ///< Enter sleep mode
#define HX8347_SLPOUT             0x11  ///< Exit sleep mode
#define HX8347B_PTLON             0x12  ///< Partial mode on
#define HX8347B_NORON             0x13  ///< Normal mode#define HX8347_INVOFF             0x20  ///< Turn off invert
#define HX8347_INVON              0x21  ///< Turn on invert
#define HX8347_DISPOFF            0x28  ///< Display on
#define HX8347_DISPON             0x29  ///< Display off#define HX8347_CASET              0x2A  ///< Column addr set
#define HX8347_PASET              0x2B  ///< Page addr set
#define HX8347_RAMWR              0x2C  ///< Write VRAM
#define HX8347_RAMRD              0x2E  ///< Read VRAm#define HX8347B_PTLAR             0x30  ///< (unknown)
#define HX8347_TEON               0x35  ///< Tear enable on
#define HX8347_TEARLINE           0x44  ///< (unknown)
#define HX8347_MADCTL             0x16  ///< Memory access control
#define HX8347_COLMOD             0x3A  ///< Color mode#define HX8347_SETOSC             0xB0  ///< Set oscillator
#define HX8347_SETPWR1            0xB1  ///< Set power control
#define HX8347B_SETDISPLAY        0xB2  ///< Set display mode
#define HX8347_SETRGB             0xB3  ///< Set RGB interface
#define HX8347D_SETCOM            0xB6  ///< Set VCOM voltage#define HX8347B_SETDISPMODE       0xB4  ///< Set display mode
#define HX8347D_SETCYC            0xB4  ///< Set display cycle reg
#define HX8347B_SETOTP            0xB7  ///< Set OTP memory
#define HX8347D_SETC              0xB9  ///< Enable extension command#define HX8347B_SET_PANEL_DRIVING 0xC0  ///< Set panel drive mode
#define HX8347D_SETSTBA           0xC0  ///< Set source option
#define HX8347B_SETDGC            0xC1  ///< Set DGC settings
#define HX8347B_SETID             0xC3  ///< Set ID
#define HX8347B_SETDDB            0xC4  ///< Set DDB
#define HX8347B_SETDISPLAYFRAME   0xC5  ///< Set display frame
#define HX8347B_GAMMASET          0xC8  ///< Set Gamma correction
#define HX8347B_SETCABC           0xC9  ///< Set CABC
#define HX8347_SETPANEL           0xCC  ///< Set Panel#define HX8347B_SETPOWER          0xD0  ///< Set power control
#define HX8347B_SETVCOM           0xD1  ///< Set VCOM
#define HX8347B_SETPWRNORMAL      0xD2  ///< Set power normal#define HX8347B_RDID1             0xDA  ///< Read ID #1
#define HX8347B_RDID2             0xDB  ///< Read ID #2
#define HX8347B_RDID3             0xDC  ///< Read ID #3
#define HX8347B_RDID4             0xDD  ///< Read ID #4#define HX8347D_SETGAMMA          0xE0  ///< Set Gamma#define HX8347B_SETGAMMA          0xC8 ///< Set Gamma
#define HX8347B_SETPANELRELATED   0xE9 ///< Set panel related/***********************      TYPEDEFS**********************//*********************** GLOBAL PROTOTYPES**********************/void hx8347_init(void);
void hx8347_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void hx8347_enable_backlight(bool backlight);
void hx8347_set_rotation(uint8_t r);/***********************      MACROS**********************/#ifdef __cplusplus
} /* extern "C" */
#endif#endif /*HX8347_H*/

hx8347.c

/*** @file HX8347.c** Roughly based on the Adafruit_HX8347_Library** This library should work with:* Adafruit 3.5" TFT 320x480 + Touchscreen Breakout*    http://www.adafruit.com/products/2050** Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers*    https://www.adafruit.com/product/3651**//**********************      INCLUDES*********************/
#include "hx8347.h"
#include "disp_spi.h"
#include "driver/gpio.h"
#include "rom/gpio.h"
#include <esp_log.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"/**********************      DEFINES*********************/
#define TAG        "HX8347"#define MADCTL_MY  0x80 ///< Bottom to top
#define MADCTL_MX  0x40 ///< Right to left
#define MADCTL_MV  0x20 ///< Reverse Mode
#define MADCTL_ML  0x10 ///< LCD refresh Bottom to top
#define MADCTL_RGB 0x00 ///< Red-Green-Blue pixel order
#define MADCTL_BGR 0x08 ///< Blue-Green-Red pixel order
//#define MADCTL_MH  0x04 ///< LCD refresh right to left/***********************      TYPEDEFS**********************//*The LCD needs a bunch of command/argument values to be initialized. They are stored in this struct. */
typedef struct {uint8_t cmd;uint8_t data[16];uint8_t databytes; //No of data in data; bit 7 = delay after set; 0xFF = end of cmds.
} lcd_init_cmd_t;/***********************  STATIC PROTOTYPES**********************/
static void hx8347_send_cmd(uint8_t cmd);
static void hx8347_send_data(void * data, uint16_t length);
static void hx8347_send_color(void * data, uint16_t length);
static void hx8347_send_16bit(uint8_t d1,uint8_t d2);/***********************  INITIALIZATION ARRAYS**********************/
// Taken from the Adafruit driver
static const uint8_tinitb[] = {//Driving ability Setting0xEA,1,0x00, //PTBA[15:8]0xEB,1,0x20, //PTBA[7:0]0xEC,1,0x0C, //STBA[15:8]0xED,1,0xC4, //STBA[7:0]0xE8,1,0x40, //OPON[7:0]0xE9,1,0x38, //OPON1[7:0]0xF1,1,0x01, //OTPS1B0xF2,1,0x10, //GEN0x27,1,0xA3,//Gamma 2.2 Setting0x40,1,0x01, //0x41,1,0x00, //0x42,1,0x00, //0x43,1,0x10, //0x44,1,0x0E, //0x45,1,0x24, //0x46,1,0x04, //0x47,1,0x50, //0x48,1,0x02, //0x49,1,0x13, //0x4A,1,0x19, //0x4B,1,0x19, //0x4C,1,0x16, //0x50,1,0x1B, //0x51,1,0x31, //0x52,1,0x2F, //0x53,1,0x3F, //0x54,1,0x3F, //0x55,1,0x3E, //0x56,1,0x2F, //0x57,1,0x7B, //0x58,1,0x09, //0x59,1,0x06, //0x5A,1,0x06, //0x5B,1,0x0C, //0x5C,1,0x1D, //0x5D,1,0xCC, //// Window setting//#if (DISP_ORIENTATION == 0)//    0x04,1,0x00,//    0x05,1,0xEF,//    0x08,1,0x01,//    0x09,1,0x3F,//#else//    0x04,1,0x01,//    0x05,1,0x3F,//    0x08,1,0x00,//    0x09,1,0xEF,//#endif//Power Voltage Setting0x1B,1,0x1B, //VRH=4.65V0x1A,1,0x01, //BT (VGH~15V,VGL~-10V,DDVDH~5V)0x24,1,0x15, //VMH(VCOM High voltage ~3.2V)0x25,1,0x50, //VML(VCOM Low voltage -1.2V)0x23,1,0x88, //for Flicker adjust //can reload from OTP//Power on Setting0x18,1,0x36, // I/P_RADJ,N/P_RADJ, Normal mode 60Hz0x19,1,0x01, //OSC_EN='1', start Osc0x01,1,0x00, //DP_STB='0', out deep sleep0x1F,1,0x88,// GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=00xFF, 0x80 + 50/5,0x1F,1,0x80,// GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=00xFF, 0x80 + 50/5,0x1F,1,0x90,// GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=00xFF, 0x80 + 50/5,0x1F,1,0xD0,// GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=00xFF, 0x80 + 50/5,//262k/65k color selection0x17,1,0x05, //default 0x06 262k color // 0x05 65k color//SET PANEL0x36,1,0x00, //SS_P, GS_P,REV_P,BGR_P//Display ON Setting0x28,1,0x38, //GON=1, DTE=1, D=10000xFF, 0x80 + 50/5,0x28,1,0x3C, //GON=1, DTE=1, D=11000x16,1,0x38, // MY=0, MX=1, MV=1, BGR=1// 0x16,1,0x80, // MY=1, MX=0, MV=0,竖屏时去掉注释//Set GRAM Area0x02,1,0x00,0x03,1,0x00, //Column Start0x04,1,0x00,0x05,1,0xEF, //Column End0x06,1,0x00,0x07,1,0x00, //Row Start0x08,1,0x01,0x09,1,0x3F, //Row End// 0x0a,1,0x00,// 0x0b,1,0xef,// 0x0c,1,0x00,// 0x0d,1,0x00,//  //************* Start Initial Sequence **********//// 	 0x2e,1,0x79,//  0xee,1,0x0c,//  //Driving ability Setting//  0xea,1,0x00,//  0xeb,1,0x20,//  0xec,1,0x08,//  0xed,1,0xc4,//  0xe8,1,0x40,//  0xe9,1,0x38,//  0xf1,1,0x01,//  0xf2,1,0x10,//  0x27,1,0xa3,//  //Gamma 2.2 Setting//  0x40,1,0x01,//  0x41,1,0x07,//  0x42,1,0x07,//  0x43,1,0x13,//  0x44,1,0x11,//  0x45,1,0x24,//  0x46,1,0x10,//  0x47,1,0x57,//  0x48,1,0x09,//  0x49,1,0x14,//  0x4a,1,0x19,//  0x4b,1,0x19,//  0x4c,1,0x16,//  0x50,1,0x1b,//  0x51,1,0x2e,//  0x52,1,0x2c,//  0x53,1,0x38,//  0x54,1,0x38,//  0x55,1,0x3e,//  0x56,1,0x2a,//  0x57,1,0x6f,//  0x58,1,0x09,//  0x59,1,0x06,//  0x5a,1,0x06,//  0x5b,1,0x0b,//  0x5c,1,0x16,//  0x5d,1,0xcc,//  //Power Voltage Setting//  0x1b,1,0x1b,//  0x1a,1,0x01,//  0x24,1,0x29,//  0x25,1,0x57,//  //****VCOM offset**/////  0x23,1,0x8a,//  //Power on Setting//  0x18,1,0x36,//  0x19,1,0x01,//  0x01,1,0x00,//  0x1f,1,0x88,//  0xFF, 0x80 + 50/5,//  0x1f,1,0x80,//  0xFF, 0x80 + 50/5,//  0x1f,1,0x90,//   0xFF, 0x80 + 50/5,//  0x1f,1,0xd0,//   0xFF, 0x80 + 50/5,//  //262k/65k color selection//  0x17,1,0x05,//  //SET PANEL//  0x36,1,0x00,//  //Display ON Setting//  0x28,1,0x38,//  0xFF, 0x80 + 50/5,//  0x28,1,0x3c,//    //设置2.8寸的GAMA参数//   0x46,1,0x94,//   0x47,1,0x41,//   0x48,1,0x00,//   0x49,1,0x33,//   0x4a,1,0x23,//   0x4b,1,0x45,//   0x4c,1,0x44,//   0x4d,1,0x77,//   0x4e,1,0x12,//   0x4f,1,0xcc,//   0x50,1,0x46,//   0x51,1,0x82,//   //320*240 peixl setting//   0x02,1,0x00,//   0x03,1,0x00,//   0x04,1,0x00,//   0x05,1,0xef,//   0x06,1,0x00,//   0x07,1,0x00,//   0x08,1,0x01,//   0x09,1,0x3f,//   //Display setting//   0x01,1,0x06,//   0x16,1,0xc8,//   0x23,1,0x95,//   0x24,1,0x95,//   0x25,1,0xFF,//   0x27,1,0x02,//   0x28,1,0x02,//   0x29,1,0x02,//   0x2a,1,0x02,//   0x2C,1,0x02,//   0x2d,1,0x02,//   0x3a,1,0x01,//   0x3b,1,0x01,//   0x3c,1,0xf0,//   0x3d,1,0x00,//   0xFF, 0x80 + 50/5,//   0x35,1,0x38,//   0x36,1,0x78,//   0x3E,1,0x3,//   0x40,1,0x0F,//   0x41,1,0xF0,//   //power supply setting//   0x19,1,0x49,//   0x93,1,0x0F,//   0xFF, 0x80 + 50/5,//   0x20,1,0x40,//   0x1D,1,0x07,//   0x1E,1,0x00,//   0x1F,1,0x03,//   //VCOM SETTING FOR 2.4' PANNNEL'//   0x44,1,0x42,//   0x45,1,0x11,//   0xFF, 0x80 + 50/5,//   0x1C,1,0x04,//   0xFF, 0x80 + 50/5,//   0x43,1,0x80,//   0xFF, 0x80 + 50/5,//   0x1B,1,0x08,//  0xFF, 0x80 + 50/5,//   // Display ON Setting//   0x90,1,0x7F,//   0x26,1,0x04,//   0xFF, 0x80 + 50/5,//   0x26,1,0x24,//   0x26,1,0x2C,//   0xFF, 0x80 + 50/5,//   0x26,1,0x3C,//   // Fixed the read data issue//   0x57,1,0x02,//   0x56,1,0x02,//   0x57,1,0x00,// //Driving ability Setting// 0xEa,1,0x00,// 0xeb,1,0x20,// 0xec,1,0x0c,// 0xed,1,0xc4,// 0xe8,1,0x38,// 0xe9,1,0x10,// 0xf1,1,0x01,// 0xf2,1,0x10,// //Gamma 2.2 Setting// 0x40,1,0x01,// 0x41,1,0x00,// 0x42,1,0x00,// 0x43,1,0x10,// 0x44,1,0x0e,// 0x45,1,0x24,// 0x46,1,0x04,// 0x47,1,0x50,// 0x48,1,0x02,// 0x49,1,0x13,// 0x4a,1,0x19,// 0x4b,1,0x19,// 0x4c,1,0x16,// 0x50,1,0x1b,// 0x51,1,0x31,// 0x52,1,0x2f,// 0x53,1,0x3f,// 0x54,1,0x3f,// 0x55,1,0x3e,// 0x56,1,0x2f,// 0x57,1,0x7b,// 0x58,1,0x09,// 0x59,1,0x06,// 0x5a,1,0x06,// 0x5b,1,0x0c,// 0x5c,1,0x1d,// 0x5d,1,0xcc,// //Power Voltage Setting// 0x1b,1,0x1b,	//4.65v// 0x1a,1,0x01,// 0x24,1,0x2f,// 0x25,1,0x57,// //vcom offset// 0x23,1,0x88,// //Power on Setting// 0x19,1,0x01,// 0x01,1,0x00,// 0x1f,1,0x88,// 0xFF, 0x80 + 50/5,// 0x1f,1,0x80,// 0xFF, 0x80 + 50/5,// 0x1f,1,0x90,// 0xFF, 0x80 + 50/5,// 0x1f,1,0xd0,// 0xFF, 0x80 + 50/5,// 0x17,1,0x60,// 0x28,1,0x38,// 0xFF, 0x80 + 50/5,// 0x28,1,0x3f,// 0x02,1,0x00,// 0x03,1,0x00,// 0x04,1,0x00,// 0x05,1,0xef,// 0x06,1,0x00,// 0x07,1,0x00,// 0x08,1,0x01,// 0x09,1,0x3f,// 0x28,1,0x38,// 0xFF, 0x80 + 50/5,// 0x1f,1,0x89,// 0xFF, 0x80 + 50/5,// 0x28,1,0x04,// 0xFF, 0x80 + 50/5,// 0x19,1,0x00,// 0xFF, 0x80 + 50/5,0                            // END OF COMMAND LIST}, initd[] = {0x18,1,0x88,  //UADJ 75Hz0x19,1,0x01,  //OSC_EN='1', start Osc//Power Voltage Setting0x1B,1,0x1E, //VRH=4.60V0x1C,1,0x07, //AP Crosstalk    040x1A,1,0x01, //BT (VGH~15V,1,VGL~-10V,1,DDVDH~5V)0x24,1,0x38, //VMH 270x25,1,0x5F, //VML//VCOM offset0x23,1,0x8C, //for Flicker adjust0x1F,1,0x88,// GAS=1,1, VOMG=00,1, PON=0,1, DK=1,1, XDK=0,1, DVDH_TRI=0,1, STB=00xFF, 0x80 + 50/5,0x1F,1,0x80,// GAS=1,1, VOMG=00,1, PON=0,1, DK=0,1, XDK=0,1, DVDH_TRI=0,1, STB=00xFF, 0x80 + 50/5,0x1F,1,0x90,// GAS=1,1, VOMG=00,1, PON=1,1, DK=0,1, XDK=0,1, DVDH_TRI=0,1, STB=00xFF, 0x80 + 50/5,0x1F,1,0xD0,// GAS=1,1, VOMG=10,1, PON=1,1, DK=0,1, XDK=0,1, DDVDH_TRI=0,1, STB=00xFF, 0x80 + 50/5,//Display ON Setting0x28,1,0x38,   //GON=1,1, DTE=1,1, D=10000xFF, 0x80 + 400/5,0x28,1,0x3C,   //GON=1,1, DTE=1,1, D=11000x36,1,0x00,   //REV,1, BGR0x17,1,0x05,  //16BIT/PIXEL//Gamma 2.2 Setting0x40,1,0x00, //0x41,1,0x00, //0x42,1,0x00, //0x43,1,0x11, //0x44,1,0x0e, //0x45,1,0x23, //0x46,1,0x08, //0x47,1,0x53, //0x48,1,0x03, //0x49,1,0x11, //0x4A,1,0x18, //0x4B,1,0x1a, //0x4C,1,0x16, //0x50,1,0x1c, //0x51,1,0x31, //0x52,1,0x2e, //0x53,1,0x3f, //0x54,1,0x3f, //0x55,1,0x3f, //0x56,1,0x2c, //0x57,1,0x77, //0x58,1,0x09, //0x59,1,0x05, //0x5A,1,0x07, //0x5B,1,0x0e, //0x5C,1,0x1c, //0x5D,1,0x88, //0xFF, 0x80 + 100/5,0,                           // END OF COMMAND LIST};/***********************  STATIC VARIABLES**********************//***********************      MACROS**********************//***********************   GLOBAL FUNCTIONS**********************/
static uint8_t displayType = HX8347B;   //HX8347B:RGBvoid lcd_cs_port(uint8_t status)
{if (status) {gpio_set_level(HX8347_CS, 1);} else {gpio_set_level(HX8347_CS, 0);}
}void hx8347_init(void)
{//Initialize non-SPI GPIOs//3线spi没有DC引脚//       gpio_pad_select_gpio(HX8347_DC);// gpio_set_direction(HX8347_DC, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(HX8347_CS);gpio_set_direction(HX8347_CS, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(HX8347_RST);gpio_set_direction(HX8347_RST, GPIO_MODE_OUTPUT);#if HX8347_ENABLE_BACKLIGHT_CONTROLgpio_pad_select_gpio(HX8347_BCKL);gpio_set_direction(HX8347_BCKL, GPIO_MODE_OUTPUT);
#endif//Reset the displaygpio_set_level(HX8347_RST, 0);vTaskDelay(10 / portTICK_PERIOD_MS);gpio_set_level(HX8347_RST, 1);vTaskDelay(120 / portTICK_PERIOD_MS);ESP_LOGI(TAG, "Initialization.");//Send all the commandsconst uint8_t *addr = (displayType == HX8347B) ? initb : initd;uint8_t        cmd, x, numArgs;while((cmd = *addr++) > 0) { // '0' command ends listx = *addr++;numArgs = x & 0x7F;if (cmd != 0xFF) { // '255' is ignoredif (x & 0x80) {  // If high bit set, numArgs is a delay timehx8347_send_cmd(cmd);} else {hx8347_send_cmd(cmd);hx8347_send_data((void *) addr, numArgs);addr += numArgs;}}if (x & 0x80) {       // If high bit set...vTaskDelay(numArgs * 5 / portTICK_PERIOD_MS); // numArgs is actually a delay time (5ms units)}}//hx8347_set_rotation(2); //Portrait竖屏 选0或2;Landscape横屏 选1或3。// #if HX8347_INVERT_COLORS
// 	hx8347_send_cmd(HX8347_INVON);
// #else
//     hx8347_send_cmd(HX8347_INVOFF);
// #endif//hx8347_enable_backlight(true);
}void hx8347_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
{uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);uint8_t data[34]={0};/* Column addresses  */uint8_t xb[] = {(uint8_t) (area->x1 >> 8) & 0xFF,(uint8_t) (area->x1) & 0xFF,(uint8_t) (area->x2 >> 8) & 0xFF,(uint8_t) (area->x2) & 0xFF,};/* Page addresses  */uint8_t yb[] = {(uint8_t) (area->y1 >> 8) & 0xFF,(uint8_t) (area->y1) & 0xFF,(uint8_t) (area->y2 >> 8) & 0xFF,(uint8_t) (area->y2) & 0xFF,};//ESP_LOGI(TAG, "hx8347_flush X:%d,%d,%d,%d",xb[0],xb[1],xb[2],xb[3]);//ESP_LOGI(TAG, "hx8347_flush Y:%d,%d,%d,%d",yb[0],yb[1],yb[2],yb[3]);// /*Column addresses*/// hx8347_send_cmd(0x02);// hx8347_send_data(&xb[0], 1);// hx8347_send_cmd(0x03);// hx8347_send_data(&xb[1], 1);// hx8347_send_cmd(0x04);// hx8347_send_data(&xb[2], 1);// hx8347_send_cmd(0x05);// hx8347_send_data(&xb[3], 1);// /*Page addresses*/// hx8347_send_cmd(0x06);// hx8347_send_data(&yb[0], 1);// hx8347_send_cmd(0x07);// hx8347_send_data(&yb[1], 1);// hx8347_send_cmd(0x08);// hx8347_send_data(&yb[2], 1);// hx8347_send_cmd(0x09);// hx8347_send_data(&yb[3], 1);// /*Memory write*/// hx8347_send_cmd(0x22);data[0]=0x70; data[1]=0x02; data[2]=0x72; data[3]=xb[0];data[4]=0x70; data[5]=0x03; data[6]=0x72; data[7]=xb[1];data[8]=0x70; data[9]=0x04; data[10]=0x72;data[11]=xb[2];data[12]=0x70;data[13]=0x05;data[14]=0x72;data[15]=xb[3];data[16]=0x70; data[17]=0x06; data[18]=0x72; data[19]=yb[0];data[20]=0x70; data[21]=0x07; data[22]=0x72; data[23]=yb[1];data[24]=0x70; data[25]=0x08; data[26]=0x72; data[27]=yb[2];data[28]=0x70; data[29]=0x09; data[30]=0x72; data[31]=yb[3];data[32]=0x70; data[33]=0x22;for(uint8_t i=0;i<17;i++){lcd_cs_port(0);//disp_spi_send_data(&data[2*i],2);hx8347_send_16bit(data[2*i],data[2*i+1]);lcd_cs_port(1);}hx8347_send_color(color_map, size * 2);
}void hx8347_enable_backlight(bool backlight)
{
#if HX8347_ENABLE_BACKLIGHT_CONTROLESP_LOGD(TAG, "%s backlight.\n", backlight ? "Enabling" : "Disabling");uint32_t tmp = 0;#if (HX8347_BCKL_ACTIVE_LVL==1)tmp = backlight ? 1 : 0;
#elsetmp = backlight ? 0 : 1;
#endifgpio_set_level(HX8347_BCKL, tmp);
#endif
}void hx8347_set_rotation(uint8_t r)
{r = r & 3; // can't be higher than 3switch(r) {case 0:r = MADCTL_MX | MADCTL_MY | MADCTL_RGB;break;case 1:r = MADCTL_MV | MADCTL_MY | MADCTL_RGB;break;case 2:r = MADCTL_RGB;break;case 3:r = MADCTL_MX | MADCTL_MV | MADCTL_RGB;break;}hx8347_send_cmd(HX8347_MADCTL);hx8347_send_data(&r, 1);
}/***********************   STATIC FUNCTIONS**********************/static void hx8347_send_16bit(uint8_t d1,uint8_t d2)
{uint8_t c[2];c[0]=d1;c[1]=d2;lcd_cs_port(0);disp_spi_send_data(&c, 2);      //发送2字节lcd_cs_port(1);
}static void hx8347_send_cmd(uint8_t cmd)
{uint8_t c;c=0x70;hx8347_send_16bit(c,cmd);// lcd_cs_port(0);// disp_spi_send_data(&c, 1);      //Command mode// disp_spi_send_data(&cmd, 1);// lcd_cs_port(1);
}static void hx8347_send_data(void * data, uint16_t length)
{uint8_t c;c=0x72;lcd_cs_port(0);disp_spi_send_data(&c, 1);      //Data modedisp_spi_send_data(data, length);lcd_cs_port(1);
}static void hx8347_send_color(void * data, uint16_t length)
{uint8_t c;c=0x72;lcd_cs_port(0);disp_spi_send_data(&c, 1);      //Data modedisp_spi_send_colors(data, length);lcd_cs_port(1);
}

三、修改components\lvgl_esp32_drivers\lvgl_tft\Kconfig文件内容

        在相关位置增加hx8347相关信息,位置可参考其他显示IC配置,方便idf.py menuconfig进行配置:

    config LV_TFT_DISPLAY_USER_CONTROLLER_HX8347

        bool "HX8347"

            select LV_TFT_DISPLAY_CONTROLLER_HX8347

            select LV_TFT_DISPLAY_PROTOCOL_SPI

    config LV_TFT_DISPLAY_CONTROLLER_HX8347

        bool

        help

            HX8347 display controller.

  

配好后,idf.py menuconfig 中就会有hx8347的选项:

 

四、其他的文件修改:

disp_spi.h

//增加了DISP_SPI_SEND_POLLING
static inline void disp_spi_send_colors(uint8_t *data, size_t length) {disp_spi_transaction(data, length,DISP_SPI_SEND_QUEUED | DISP_SPI_SIGNAL_FLUSH|DISP_SPI_SEND_POLLING,NULL, 0, 0);
}

disp_spi.c

void disp_spi_transaction(const uint8_t *data, size_t length,disp_spi_send_flag_t flags, uint8_t *out,uint64_t addr, uint8_t dummy_bits)
{.......if (length <= 4 && data != NULL) {t.base.flags = SPI_TRANS_USE_TXDATA;memcpy(t.base.tx_data, data, length);} else {t.base.flags =SPI_DEVICE_CLK_AS_CS|SPI_DEVICE_NO_DUMMY;//增加了这句t.base.tx_buffer = data;}
.......

disp_driver.h增加了:

#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8347
#include "hx8347.h"

disp_dirver.c增加了:

#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8347hx8347_init();#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8347hx8347_flush(drv, area, color_map);

应该还有其他的地方修改,总之是使lv_port_esp32支持HX8347。

五、最后

LVGL

六、总结

1、ESP32S3运行LVGL,需要LVGL+lv_port_esp32。

2、运行LVGL通常需要4线spi,很不巧,笔者手头的HX8347只支持3线SPI。所以什么都要自己写。3线SPI性能比4线差不少。CS还需要手动控制。

3、0x16寄存器要设置下面这样,否则左右可能颠倒

0x16,1,0x38, // MY=0, MX=1, MV=1, BGR=1

如果用竖屏,要加上:

 0x16,1,0x80, // MY=1, MX=0, MV=0,竖屏时去掉注释

4、idf.py menuconfig的一些设置:

flash size

 运行的例子:

LVGL configuration

LVGL TFT Display configration 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/823603.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

分库分表之Mycat应用学习二

3 Mycat 概念与配置 官网 http://www.mycat.io/ Mycat 概要介绍 https://github.com/MyCATApache/Mycat-Server 入门指南 https://github.com/MyCATApache/Mycat-doc/tree/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%973.1 Mycat 介绍与核心概念 3.1.1 基本介绍 历史&#x…

怎么使用FTP

FTP服务器&#xff08;File Transfer Protocol Server&#xff09;是在互联网上提供文件存储和访问服务的计算机&#xff0c;它们依照FTP协议提供服务。FTP是File Transfer Protocol的缩写&#xff0c;即文件传输协议&#xff0c;是一种基于TCP的协议&#xff0c;采用客户/服务…

软件测试/测试开发丨Python 数据类 dataclass 学习笔记

dataclass 介绍 dataclass优势 可读性强操作灵活轻量 应用场景 创建对象完美融合平台开发 ORM 框架 案例 场景&#xff1a;如果创建一只猫&#xff0c;信息包括猫的名字、体重、颜色。同时打印这个对象的时候&#xff0c;希望能打印出一个字符串&#xff08;包含猫的各种信息&…

Python跨年烟花秀

写在前面 今年跨年怎么过呢~博主用python的pygame实现了一场炫酷的烟花秀&#xff0c;一起来看看吧&#xff01; 环境需求 python3.11.4及以上PyCharm Community Edition 2023.2.5pyinstaller6.2.0&#xff08;可选&#xff0c;这个库用于打包&#xff0c;使程序没有python环境…

图灵日记之java奇妙历险记--继承和多态

目录 继承概念继承语法父类成员访问子类中访问父类的成员变量子类中访问父类的成员方法 super关键字子类构造方法super和this初始化protected关键字继承方式final 关键字继承与组合 多态条件向上转型重写动态绑定&&静态绑定多态再理解向下转型多态的优缺点好处缺陷 继承…

【Transformer】深入理解Transformer模型2——深入认识理解(下)

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

java springboot宠物医院管理系统

一.项目简介 宠物医院管理系统&#xff0c;java项目&#xff0c;springboot项目。eclipse和idea都能打开运行。 使用技术&#xff1a;springboot&#xff0c;mybatis&#xff0c;jsp&#xff0c;mysql 5.7 共分为三个角色&#xff1a;系统管理员、医生、用户 功能模块&…

9. 进程

9. 进程 1. 进程与程序1.1 main() 函数由谁调用1.2 程序如何结束1.2.1 注册进程终止处理函数 atexit() 1.3 何为进程1.4 进程号 2. 进程的环境变量2.1 应用程序中获取环境变量2.1.1 获取指定环境变量 2.2 添加/删除/修改环境变量2.2.1 putenv()2.2.2 setenv()2.2.3 命令行式添加…

springboot参数校验常用注解及分组校验

一、使用方式添加Validated 二、常见注解 Null 被注解的元素必须为null NotNull 被注解的元素必须不为null NotBlank 只能作用在接收的 String 类型上&#xff0c;注意是只能&#xff0c;不能为 null&#xff0c;而且调用 trim() 后&#xff0c;长度必须大于 0即&#xff…

在 Linux 中使用 cat 命令

cat 命令用于打印文本文件的文件内容。至少&#xff0c;大多数 Linux 用户都是这么做的&#xff0c;而且没有什么问题。 cat 实际上代表 “连接(concatenate)”&#xff0c;创建它是为了 合并文本文件。但只要有一个参数&#xff0c;它就会打印文件内容。因此&#xff0c;它是用…

【数据结构】双向带头循环链表的实现

前言&#xff1a;在前面我们学习了顺序表、单向链表&#xff0c;今天我们在单链表的基础上进一步来模拟实现一个带头双向链表。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &#x1f4af;代码仓库:卫卫周大胖的…

软件测试/测试开发丨Python 内置库 正则表达式re

什么是正则表达式 正则表达式就是记录文本规则的代码可以查找操作符合某些复杂规则的字符串 使用场景 处理字符串处理日志 在 python 中使用正则表达式 把正则表达式作为模式字符串正则表达式可以使用原生字符串来表示原生字符串需要在字符串前方加上 rstring # 匹配字符…

基于Java学生成绩管理系统设计与实现(源码+部署文档+报告)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

结构体:是第几天

今天是该年的第几天 #include<iostream> using namespace std; struct Date //创建结构体 {int year; //年int month; //月int day; //日 }; void inputDate(Date *p) //输入函数 {cin >> p->year >> p->month >> p->day; //输入年、月、…

C++内联函数与引用(超详细)

文章目录 前言一、内联函数1.为什么会存在内联函数2.什么是内联函数3.内联函数注意事项 二、引用1.什么是引用2.引用的特性3.常引用4.引用使用场景5.引用与指针 总结 前言 一、内联函数 1.为什么会存在内联函数 &#x1f9d0;&#x1f9d0;首先我们介绍内联函数之前&#xf…

记一次JSF异步调用引起的接口可用率降低 | 京东云技术团队

前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程&#xff0c;主要介绍了排查思路和JSF异步调用的流程&#xff0c;希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF 1,7.5-HOTFIX-T6版本。 起因 问题背景…

基于 Vue3 和 WebSocket 实现的简单网页聊天应用

首先附上项目介绍,后面详细解释技术细节 1. chat-websocket 一个基于Vue3和WebSocket的简易网络聊天室项目&#xff0c;包括服务端和客户端部分。 项目地址 websocket-chat 下面是项目的主要组成部分和功能&#xff1a; 项目结构 chat-websocket/ |-- server/ # WebSocket 服…

Linux上管理不同版本的 JDK

当在 Linux 上管理不同版本的 JDK 时&#xff0c;使用 yum 和 dnf 可以方便地安装和切换不同的 JDK 版本。本文将介绍如何通过这两个包管理工具安装 JDK 1.8 和 JDK 11&#xff0c;并利用软连接动态关联这些版本。 安装 JDK 1.8 和 JDK 11 使用 yum 安装 JDK 1.8 打开终端并…

【AIGC表情prompt】提示词练习技巧

表情类提示词练习技巧 医疗机器人&#xff0c;男人笑脸景深&#xff0c;数据&#xff0c;座标&#xff0c;12k,c4d渲染&#xff0c;高分辨率&#xff0c;,暖色调&#xff0c;高清对比 医疗机器人&#xff0c;男人微笑&#xff0c;景深&#xff0c;数据&#xff0c;座标&#xf…

线上发布稳定性方案介绍

目录 一、方案说明 二、线上发布问题描述 2.1 无损上下线背景说明 2.1.1 服务⽆法及时下线 2.1.2 初始化慢 2.1.3 注册太早 2.1.4 发布态与运⾏态未对⻬ 三、问题解决方案 3.1 无损下线方案 3.1.1 什么是无损下线 3.1.2 传统解决方式 3.1.3 云原生场景解决方案 3.1…