ESP32 ESP-IDF TFT-LCD(ST7735 128x160)自定义组件驱动显示

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请解释一下Standford Alpaca格式、sharegpt数据格式-------deepseek问答记录

1 Standford Alpaca格式 json格式数据。Stanford Alpaca 格式是一种用于训练和评估自然语言处理&#xff08;NLP&#xff09;模型的数据格式&#xff0c;特别是在指令跟随任务中。它由斯坦福大学的研究团队开发&#xff0c;旨在帮助模型理解和执行自然语言指令。以下是该格式的…

数据治理中 大数据处理一般都遵循哪些原则

在数据治理中&#xff0c;大数据处理通常遵循以下原则&#xff1a; 最小化原则&#xff1a;企业应只收集实现特定目的所需的数据&#xff0c;避免数据冗余和安全风险。 合法性原则&#xff1a;企业必须遵守相关法律法规&#xff0c;确保数据处理符合法律要求&#xff0c;降低法…

Python 基础-使用dict和set

dict Python内置了字典&#xff1a;dict的支持&#xff0c;dict全称dictionary&#xff0c;在其他语言中也称为map&#xff0c;使用键-值&#xff08;key-value&#xff09;存储&#xff0c;具有极快的查找速度。 举个例子&#xff0c;假设要根据同学的名字查找对应的成绩&am…

《模式和状态管理》知识总结

一、ECUM 1.1 缩略语 我在这里列出的一些名词的含义只是我在学习过程中自己并不知晓的名词&#xff0c;有其他不会的名词可以自行阅读文档。&#xff08;会读文档真嘟很重要&#xff09; Callback&#xff1a;回调函数&#xff0c;由高级的模块提供&#xff0c;由低级的模块…

基于语音的阿尔茨海默病检测识别

摘要 阿尔茨海默病 &#xff08;AD&#xff09; 是一种进行性神经退行性疾病&#xff0c;会严重损害认知功能&#xff0c;导致记忆力减退和其他行为改变。它是全球第七大死因&#xff0c;有数百万人受到影响。早期准确检测 AD 对于改善患者预后和减缓疾病进展至关重要。机器学习…

Bom详解和Dom详解

Javascript的数据类型 1.BOM(浏览器对象模型)1.1window对象(1)全局作用域&#xff1a;(2)窗口属性&#xff1a;(3)弹窗和对话框&#xff1a;(4)定时器&#xff1a;(5)导航和历史&#xff1a;(6)打开和关闭窗口&#xff1a; 1.2navigator对象(1)浏览器信息属性&#xff1a;(2)浏…

openharmony中HDF驱动框架关键流程说明-观察者模式

在分析openharmony 5.0的HDF驱动框架时我们会发现用了很多面向对象的思想&#xff0c;例如类继承、接口、单例类等&#xff0c;本来应该是好事情&#xff0c;但使用时对象之间的关系交错复杂&#xff0c;不太符合linux内核分层分模块的思路&#xff0c;导致整体理解起来比较困难…

深度学习框架及其常用模型文件保存格式

在深度学习领域&#xff0c;不同的框架有各自常用的模型文件保存格式。了解这些格式对于模型的训练、保存、部署和分享都非常重要。下面将详细介绍几种常见深度学习框架及其对应的模型文件保存格式。 1. PyTorch 框架 1.1 文件格式 .pt .pth 1.2 说明 这两种文件格式本质上…

Java字符串到底能有多长

文章目录 编译期运行期实际开发建议总结编译期 在编写代码时,直接写在代码里的字符串(硬编码字符串)有一个长度限制。具体来说,字符串的最大长度不能超过65534个字符。如果超过这个限制,编译器会报错。 当你在代码里直接写字符串时: String text = "我是一个很长很…

blender骨骼分层问题:某一层的骨骼怎么移动到第一层

一、原生Blender骨骼分层操作方法 1. 进入姿态模式 按A选中骨骼 →按M →鼠标左键点击相应骨骼层 注意&#xff1a;Blender原生界面中&#xff0c;骨骼层是通过姿态模式下的快捷键M勾选框直接控制的&#xff0c;每个勾选框对应一个层&#xff08;共32层&#xff09;。移动骨…

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…

cornerstone3D学习笔记-MPR

最近在研究如何利用cornerstone3D (v1.70.13) 来实现MPR功能&#xff0c;找到它的一个demo -- volumeBasic, 运行效果如下图 看了下主程序的示例代码&#xff0c;非常简单&#xff0c;可以说corestone3D这个库把很多细节都封装起来了&#xff0c;使得调用者可以很简单的快速实…

使用 Go-DeepSeek 轻松调用 DeepSeek 模型:从在线 API 到本地部署

引言 DeepSeek 是一个强大的 AI 模型平台&#xff0c;支持多种自然语言处理任务&#xff0c;如对话生成、代码补全和函数调用。为了方便 Go 开发者快速集成 DeepSeek 的功能&#xff0c;我开发了一个非官方的 Go 客户端库&#xff1a;go-deepseek。本文将详细介绍如何使用该库…

VSCode 实用快捷键

前文 VSCode 作为文本编辑神器, 熟练使用其快捷键更是效率翻倍, 本文介绍 VSCode 常用的实用的快捷键 实用快捷键 涉及到文本操作, 搜索定位, 多光标, 面板打开等快捷键 功能快捷键复制光标当前行 (不需要鼠标选中) Ctrl C 剪切光标当前行 (不需要鼠标选中) Ctrl X 当前行下…

28、深度学习-自学之路-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示

import sys,random,math from collections import Counter import numpy as npnp.random.seed(1) random.seed(1) f open(reviews.txt) raw_reviews f.readlines() f.close()tokens list(map(lambda x:(x.split(" ")),raw_reviews))#wordcnt Counter() 这行代码的…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…

【Rust中级教程】1.10. 引用及内部可变性(简单回顾):引用、内部可变性、`Cell`类型及相关操作

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 这篇文章只对所有权进行简单回顾&#xff0c;想要看完整的所有权系统阐述见【Rust自学】专栏…

2012年下半年软件设计师上午题知识点及其详细解释(附真题及答案解析)

以下是2012年下半年软件设计师上午题的所有题目&#xff08;从第1题到第75题&#xff09;的总结&#xff0c;按顺序列出每道题目的考察知识点及其详细解释&#xff0c;供考生背诵记忆&#xff1a; 1. 控制器 知识点&#xff1a;CPU的组成与功能解释&#xff1a;控制器负责指令…

openGauss 6.0.0 RC1数据库日常运维

引言 随着数字化时代的快速发展&#xff0c;数据库作为企业信息化的核心&#xff0c;其稳定性和性能对于企业至关重要。openGauss 6.0.0 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验&…

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言&#xff1a; 最近&#xff0c;DeepSeek-R1在完全开源的背景下&#xff0c;与OpenAI的O1推理模型展开了激烈竞争&#xff0c;引发了广泛关注。为了让更多本地用户能够运行DeepSeek&#xff0c;我们成功将R1 671B参数模型从720GB压缩至131GB&#xff0c;减少了80%&#xff…