ESP32 ESP-IDF TFT-LCD(ST7735 128x160)自定义组件驱动显示
- 🌿驱动参考来源:
https://blog.csdn.net/weixin_59250390/article/details/142691848
- 📍个人相关驱动内容文章:《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使用》
- 🔖ESPIDF版本:
v5.4
✨个人在使用上面的驱动代码驱动时,直接放在工程目录下面使用没有问题,在将驱动文件作为组件形式放置到组件里面使用时,调用遇到了一些问题,为了避免其他使用者踩同样的坑,特此记录一下。
🔰components
文件夹和managed_components
文件夹差异
在espidf项目中,
components
文件夹和managed_components
文件夹都是用来存放组件的。它们之间的使用差异如下:
1. 组件内容差异
- components文件夹
存放用户自定义或项目本地组件,例如: - 用户自行开发的驱动程序(如LCD显示屏驱动、传感器驱动等);
- 从其他项目手动拷贝的第三方组件(如ESP-IoT-Solution中的部分组件);
- 通过VSCode命令(如idf.py create-component)生成的组件模板
managed_components文件夹
存放通过组件管理器(Component Manager)自动下载的组件,例如: - 官方注册表(ESP Component Registry)中的组件(如espressif/button、lvgl/lvgl);
- 第三方发布的依赖库(需通过idf.py add-dependency命令添加)
2. 管理方式
- components文件夹
- 手动管理:需用户自行编写代码、配置CMakeLists.txt 文件(声明依赖、头文件路径等);
- 路径优先级高:项目会优先搜索components中的组件,其次才是ESP-IDF内置组件。
- managed_components文件夹
- 自动管理:通过idf.py add-dependency命令添加依赖后,IDF工具会自动下载组件并更新dependencies.lock 文件;
- 禁止手动修改:该文件夹内容由组件管理器维护,用户仅需调用接口,无需修改文件。
3. 构建流程差异
- components
需在CMakeLists.txt 中显式配置路径和依赖(如INCLUDE_DIRS、REQUIRES) - managed_components
构建时自动解析idf_component.yml 清单文件,并递归处理依赖关系,无需手动配置。
📗自定义组件创建方法
- ✨个人自定义的组件使用自定义组件生成。不要自己在项目中自己创建
managed_components
形式来加载组件,不然会在后的项目编译过程中,可能会遇到各种问题。
- 从VSCode 设置菜单-命令面板(Crtrl +Shift +P),来创建ESPIDF项目中的自定义组件。
- 输入想要创建的组件名称。
- 组件被创建后,项目目录下会自动生成下面框选内容:(包含组件文件夹以及下面的include文件夹以及cmakelist.txt文件)
- 放置驱动源文件以及头文件到组件目录对应位置。
- 🌿组件目录下的
cmakelist.txt
文件内容填写:
idf_component_register(SRCS "lib_lcd7735.c"INCLUDE_DIRS "include"PRIV_REQUIRES driver )
- 🌿main文件目录下的cmakelist.txt文件填写:
set(srcs "hello_world_main.c")
idf_component_register(SRCS ${srcs}PRIV_REQUIRES spi_flash driverREQUIRES lib_lcd7735INCLUDE_DIRS "")
📘SPI参数配置
- ⚡通讯设备时钟频率可以设置到30MHz,但是设置为40MHz就无法显示了,但是在使用上面的LVGL内容中,所使用设备通讯时钟频率为40MHz,驱动显示没有问题。
- 屏幕驱动显示仅涉及到
写
数据到ST7735屏幕中。如果挂载有多路SPI设备,需要使用读SPI设备数据操作,保证通讯质量,则通讯频率可能低于10MHz.
/*** @brief spi gpio初始化* @note 可修改适配自己不同的硬件*/
void LcdGpioSpiInit(void)
{//--gpio 配置 add your codegpio_config_t lcd_io = {.intr_type = GPIO_INTR_DISABLE,.mode = GPIO_MODE_OUTPUT,.pin_bit_mask = (1 << LCD_PIN_RES), ///<RES GPIO.pull_down_en = GPIO_PULLDOWN_DISABLE,.pull_up_en = GPIO_PULLUP_ENABLE,};gpio_config(&lcd_io);
#if !(LCD_HARDWARE_CS) ///<CS GPIOlcd_io.pin_bit_mask = (1 << LCD_PIN_CS);gpio_config(&lcd_io);
#endiflcd_io.pin_bit_mask = (1 << LCD_PIN_A0); //A0 GPIOgpio_config(&lcd_io);//总线配置 add your codespi_bus_config_t buscfg = {.miso_io_num = -1, ///<gpio12->miso.mosi_io_num = LCD_PIN_SDA, ///<gpio13->mosi.sclk_io_num = LCD_PIN_SCL ///<gpio14-> sclk};buscfg.max_transfer_sz = 12800; ///<设置传输数据的最大值。非DMA最大64bytes,DMA最大4096bytes:40 * sizeof(uint8_t)//buscfg.intr_flags = 0; ///<这个用于设置SPI通讯中相关的中断函数的中断优先级,0是默认。esp_err_t tft_spi_f = spi_bus_initialize(LCD_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO); ///<总线初始化,并且使用DMA传输if (tft_spi_f != ESP_OK) {printf("--tft--spi--bus--initialize--err,%d\n", tft_spi_f); ///<错误信息打印}//设备配置结构体 add your codespi_device_interface_config_t interface_config = {.address_bits = 0,.command_bits = 0,.clock_speed_hz = 30 * 1000 * 1000,.mode = LCD_SPI_MODE, ///<设置SPI通讯的相位特性和采样边沿。包括了mode0-3四种。要看从设备能够使用哪种模式
#if LCD_HARDWARE_CS ///<宏选择硬件CS///传输前线片选 几个时钟再传数据不然容易失败// .cs_ena_pretrans = 2,// .cs_ena_posttrans = 2,.spics_io_num = -1, //LCD_PIN_CS, ///<配置片选线
#endif.pre_cb=NULL,.post_cb=NULL,//NULL.duty_cycle_pos = 0,.queue_size = 6 ///<传输队列的长度,表示可以在通讯的时候挂起多少个spi通讯。在中断通讯模式的时候会把当前spi通讯进程挂起到队列中};tft_spi_f = spi_bus_add_device(LCD_SPI_HOST, &interface_config, &tft_hspi); ///<添加spi设备if (tft_spi_f != ESP_OK) {printf("--tft--spi--deiver--config--err,%d\n", tft_spi_f); ///<错误信息打印}
}
- ESP32 SPI引脚和接口
//HSPI
// #define LCD_PIN_CS GPIO_NUM_15 ///< 片选
// #define LCD_PIN_RES GPIO_NUM_2 ///< 复位
// #define LCD_PIN_A0 GPIO_NUM_3 ///< 命令/数据
// #define LCD_PIN_SDA GPIO_NUM_13 ///< MOSI
// #define LCD_PIN_SCL GPIO_NUM_14 ///< spi CLK
//VSPI
#define LCD_PIN_CS GPIO_NUM_5 ///< 片选
#define LCD_PIN_RES GPIO_NUM_22 ///< 复位
#define LCD_PIN_A0 GPIO_NUM_21 ///< 命令/数据 DC
#define LCD_PIN_SDA GPIO_NUM_23 ///< MOSI
#define LCD_PIN_SCL GPIO_NUM_18 ///< spi CLK
📚工程源码
通过网盘分享的文件:lcd_st7735.rar
链接: https://pan.baidu.com/s/1h-D51el39i2jhQ1joDfFpA?pwd=65ia 提取码: 65ia