ESP32-S3-Touch-new
| ||||||||||||||||||||
| ||||||||||||||||||||
说明
产品简介
ESP32-S3-Touch-LCD-4.3 是一款微雪 (Waveshare) 设计的低成本,高性能的微控制器开发板。其支持 2.4GHz WiFi 和 BLE 5,集成大容量 Flash 和 PSRAM,板载 4.3 英寸电容触摸LCD屏,可流畅运行 LVGL 等 GUI 界面程序;结合多种外设接口(如:CAN、I2C、RS485和Sensor等接口),快速开发 ESP32-S3 的 HMI 等应用。多种功能与接口满足在物联网 (IoT)、移动设备、智能家居等应用场景的功耗需求。
产品特性
- 搭载高性能 Xtensa 32 位 LX7 双核处理器,主频高达 240MHz
- 支持 2.4 GHz Wi-Fi (802.11 b/g/n) 和 Bluetooth 5 (LE),板载天线
- 内置 512KB SRAM 和 384KB ROM,叠封 8MB Flash 和 8MB PSRAM
- 板载 4.3 英寸电容触摸屏,800 × 480 分辨率,65K 彩色
- 支持 I2C 接口控制电容触摸,5 点触控,支持中断
- 板载 CAN、RS485、I2C 接口和 Micro SD 卡座等,集成全速 USB 串口
- 支持灵活时钟,模块电源单独设置等精准控制,实现多场景低功耗模式
硬件说明
接口说明
- UART 接口 :使用 CH343P 芯片用于 USB 转 UART 连接 ESP32-S3 的 UART_TXD(GPIO43),UART_RXD(GPIO44) ,用于固件烧录和日志打印
- USB 接口:GPIO19(DP) GPIO20(DN) 默认作为 ESP32-S3 的 USB 引脚 ,接口可以使用 UVC 等协议摄像头,UVC驱动请查阅连接
- Sensor 接口:此接口连接 GPIO6 作 ADC 使用,可以接入 Sensor套件等器件
- CAN 接口:CAN 接口引脚和 USB 接口引脚复用,使用 FSUSB42UMX 芯片切换,默认使用 USB 接口(FSUSB42UMX的USB_SEL引脚为LOW时)
- I2C 接口:ESP32-S3 提供多路硬件 I2C ,目前使用 GPIO8(SDA),GPIO9(SCL) 引脚做 I2C 总线挂载 IO 扩展芯片、触摸接口,I2C接口
- RS485 接口:开发板板载 RS485 接口电路,可直接接入 RS485 设备进行通信,RS485电路收发模式自动切换
- PH2.0 电池接口:开发板使用高效充放电管理芯片 CS8501 ,可将单节锂电池升压到 5V ,目前充电电流为 580mA,用户可更换 R45 电阻更改充电电流,详情请查阅原理图
引脚连接
ESP32-S3-WROOM-x | LCD | USB | SD | UART | CAN | Sensor | |
GPIO0 | G3 | ||||||
GPIO1 | R3 | ||||||
GPIO2 | R4 | ||||||
GPIO3 | VSYNC | ||||||
GPIO4 | TP_IRQ | ||||||
GPIO5 | DE | ||||||
GPIO6 | AD | ||||||
GPIO7 | PCLK | ||||||
GPIO8 | TP_SDA | ||||||
GPIO9 | TP_SCL | ||||||
GPIO10 | B7 | ||||||
GPIO11 | MOSI | ||||||
GPIO12 | SCK | ||||||
GPIO13 | MISO | ||||||
GPIO14 | B3 | ||||||
GPIO15 | RS485_TX | ||||||
GPIO16 | RS485_RX | ||||||
GPIO17 | B6 | ||||||
GPIO18 | B5 | ||||||
GPIO19 | USB_DN | CANRX | |||||
---|---|---|---|---|---|---|---|
GPIO20 | USB_DP | CANTX | |||||
GPIO21 | G7 | ||||||
GPIO38 | B4 | ||||||
GPIO39 | G2 | ||||||
GPIO40 | R7 | ||||||
GPIO41 | R6 | ||||||
GPIO42 | R5 | ||||||
GPIO43 | UART_TXD | ||||||
GPIO44 | UART_RXD | ||||||
GPIO45 | G4 | ||||||
GPIO46 | HSYNC | ||||||
GPIO47 | G6 | ||||||
GPIO48 | G5 | ||||||
CH422G | - | - | - | - | - | - | |
EXIO1 | TP_RST | ||||||
EXIO2 | DISP | ||||||
EXIO3 | LCD_RST | ||||||
EXIO4 | SD_CS | ||||||
EXIO5 | USB_SEL(LOW) | USB_SEL(HIGH) |
硬件连接
- 开发板板载自动下载电路,UART 丝印处 Type C 端口用于程序下载和日志打印,下载程序后,按 RESET 按键运行程序
- 使用时注意 PCB 天线区域,避免其它金属,塑料件贴合 PCB 天线
- 开发板使用 PH2.0 座子引出 ADC ,CAN,I2C,RS485 外设引脚,使用 PH2.0 转 2.54mm 杜邦公头配件连接传感器件
- 4.3inch 屏幕占用绝大多数 GPIO,开发板使用 CH422G 芯片扩展 IO,用于复位,关闭打开背光等
- CAN 和 RS485 外设默认使用跳冒连接 120 欧姆电阻,可选 NC 取消终端电阻连接
- SD 卡使用 SPI 通信,注意 SD_CS 引脚需要由 CH422G 的 EXIO4 驱动
开发工具介绍
这两种开发方式各有其优势,开发者可以根据自身需求和技能水平进行选择。Arduino 适合初学者和非专业人士,因其简单易学、上手快。而对于有专业背景或对性能要求较高的开发者,ESP-IDF 是更好的选择,它提供了更高级的开发工具和更强的控制能力,适用于复杂项目的开发。
Arduino 开发
Arduino 环境搭建
要使用 Arduino 调试 ESP32,需安装三个部分:Arduino IDE、ESP32 开发板管理器及示例程序相关依赖库。由于 Arduino IDE 会定期更新开发板包和依赖库,这些更新可能引入不兼容的更改,导致部分示例程序依赖的库文件版本不兼容。为减少开发过程中可能出现的编译错误等问题,建议用户直接使用我们的离线安装包。
工具 | 说明 | 版本 | 下载地址 |
---|---|---|---|
Arduino IDE | 内置了编译器、上传工具和监控工具,可以一键编译并烧录到目标设备 | v1.8以上 | Arduino IDE |
ESP32 开发板管理器 (esp32_package_3.0.2_arduino) |
开发板管理器允许你从Arduino官方和第三方提供的库中选择并安装所需的开发板包。例如,安装ESP32开发板包后,IDE就可以编译和上传程序到ESP32板子上。 | v3.0.2 | esp32_package_3.0.2_arduino |
依赖库文件 | ESP32 微控制器的特定显示面板控制库、I/O 扩展库和 LVGL图形化库 | LVGL库版本是v8.4.0 | ESP32-S3-Touch-LCD-4.3 示例程序下 Arduino/libraries |
Arduino IDE 安装
- 点击访问Arduino官网,选择对应的系统和系统位数下载。Arduino IDE的版本需要≥1.8,安装的路径不能出现中文,否则编译时会出现错误。
- 运行安装程序,全部默认安装即可。
ESP32 开发板管理器安装
- 安装前关闭 Arduino IDE,下载esp32_package_3.0.2_arduino离线包 后双击安装,设置好 Arduino 器件包目录:
C:\Users\{用户名}\AppData\Local\Arduino15\packages\
- 以用户名为 waveshare 为例
C:\Users\waveshare\AppData\Local\Arduino15\packages\
- 在开发板管理器里面搜索ESP32,如果出现“esp32 by Espressif Systems 3.0.2”已安装,则离线包安装成功
- 如果您能自行解决不兼容问题或能够科学上网,也可以按照在线教程进行安装。ESP32 开发板管理在线安装教程
依赖库安装
- 首先打开 File->preferences->Sketchbook location下查看项目文件夹路径。
- 将相关的依赖库文件复制到 C:\Users\xxxx\Documents\Arduino\libraries 目录下,xxxx 代表您电脑上用户名
- 将解压文件放在对应用户的arduino器件包目录
C:\Users\{用户名}\AppData\Local\Arduino15\packages\
以用户名为waveshare为例C:\Users\waveshare\AppData\Local\Arduino15\packages\
- 如果您能自行解决不兼容问题或能够科学上网,也可以按照在线教程进行安装。Arduino 依赖库在线安装教程
Arduino 程序下载
准备工作
开发板板载有自动下载电路,两个接口均支持程序上传。其中,带有 UART 标识的 USB-C 接口为 USB 转 UART,可用于 Arduino 串口调试和程序输出打印。
- ① USB Bridge 是一种通用的接口转换工具,用于将 USB 转换为其他类型的接口,适用于各种设备间的通信和调试。
- ② USB JTAG 是一种专用的调试和编程工具,专门用于集成电路的调试和编程,提供硬件级别的测试和诊断功能。
USB 设备
UART 设备
上传第一个程序
新建工程
void setup() { // put your setup code here, to run once: Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: Serial.println("Hello, World!"); delay(2000); }
- 保存代码工程,选择
File
->Save As...
;在弹出的菜单选择保存工程路径,并输入工程名,如 Hello_World,点击保存
上传设置
- 在Arduino中,开发板和端口的设置是确保代码可以正确编译、上传并在开发板上运行的重要步骤。开发板设置定义了目标硬件的编译选项、工具链和烧录方式,而端口设置确保IDE能与开发板通信并上传代码。使用屏幕时,Arduino IDE要配置如下参数:
开发板选择ESP32S3 DEV Module Flash Size 设置成 8MB(64Mb) PSRAM 设置成 OPI PSRAM
- 具体设置如图所示:
Arduino示例程序
外设与接口
UART_Test
UART_Test 示例用于测试 UART 接口。该接口连接 GPIO43(TXD)和 GPIO44(RXD),用作 UART0。
- 烧录代码后,将 USB to Type-C 线接入标有“UART”的 Type-C 接口。
- 打开 Arduino 右上角的串口监视器,并向 ESP32-S3-Touch-LCD-4.3 发送消息。
- ESP32-S3-Touch-LCD-4.3 会将接收到的消息返回给串口,注意需要选择正确的COM口和波特率。
- 重点函数解析:
readString() 函数可用于从设备接收到数据中读取数据信息。读取到的信息将以字符串格式返回。
Sensor_AD
- Sensor_AD 示例用于测试 Sensor AD 座子的使用。该接口连接 GPIO6,用作 ADC,可接入 Sensor套件等外接设备。
- 烧录代码后,使用 "HY2.0 2P 转杜邦公头 3P 10cm" 线将 Sensor AD 座子连接传感器。
- 打开串口调试助手,可观察 AD 引脚读取的相关数据:ADC analog value 表示读取的 ADC 模拟值,ADC millivolts value 表示模拟值转化的毫伏数值。
- 测试步骤:
- 将AD引脚与GND引脚短接,读取的值如下图所示:
- 将AD引脚与3V3引脚短接,读取的值如下图所示:
I2C_Test
- I2C_Test 示例用于测试 I2C 座子的使用。该接口通过 GPIO8 (SDA) 和 GPIO9 (SCL) 实现 I2C 通讯。
- 库文件准备。使用该例程驱动 BME680 环境传感器。编译前需通过 Library Manager 安装 “BME68x Sensor Library”。
- 硬件连接。烧录代码后,使用 HY2.0 2P 转杜邦公头 4P 10cm 的连接线,最后将 I2C 座子与 BME680 环境传感器 连接。
- 数据检测。连接完成后,通过串口调试助手观察以下检测数据。
① 温度(单位:℃)
② 大气压(单位:Pa)
③ 相对湿度(单位:%RH)
④ 气体阻值(单位:ohms)
⑤ 设备状态
RS485_Test
RS485_Test 示例,用于测试RS-485 座子的使用,此接口连接GPIO15(TXD)、GPIO16(RXD) 作 RS485通讯 使用
- 烧录代码后,该例程需要使用到USB转RS485转换器,RS-485 座子连接“HY2.0 2P 转杜邦公头 2P 10cm”,再连接USB转RS485转换器,USB转RS485转换器连接电脑
- 打开串口调试助手,发送RS485消息给ESP32-S3-Touch-LCD-4.3,ESP32-S3-Touch-LCD-4.3会把收到的消息返回给串口调试助手,注意需要选择正确的COM口和波特率,发送消息前勾选“加回车换行/AddCrLf”
SD_Test
SD_Test 示例,用于测试SD卡座的使用,需先插入SD卡,烧录代码后对SD卡进行读写操作
- 烧录代码后,ESP32-S3-Touch-LCD-4.3会识别SD卡的类型和大小,再对进行文件的增删改查
TWAItransmit
TWAItransmit 示例,用于测试CAN卡座的使用,此接口连接GPIO20(TXD)、GPIO19(RXD) 作 CAN通讯 使用
- 烧录代码后,使用 “HY2.0 2P 转杜邦公头 2P 红黑 10cm” 线缆对应连接 ESP32-S3-Touch-LCD-4.3 和 USB-CAN-A 的 CAN H 和 CAN L引脚
- 打开串口调试助手,可以看到Esp32-s3-touch-lcd-4.3已经开始发送CAN消息
- USB-CAN-A 连接电脑,打开USB-CAN-A_TOOL_2.0 上位机,选择对应COM口, 按下图所示 2000000 端口波特率,CAN波特率 50.000Kbps,即可看到Esp32-s3-touch-lcd-4.3发送的CAN消息
TWAIreceive
TWAIreceive 示例,用于测试CAN卡座的使用,此接口连接GPIO20(TXD)、GPIO19(RXD) 作 CAN通讯 使用
- 烧录代码后,使用 “HY2.0 2P 转杜邦公头 2P 红黑 10cm” 线缆对应连接 ESP32-S3-Touch-LCD-4.3 和 USB-CAN-A 的 CAN H 和 CAN L引脚
- USB-CAN-A 连接电脑,打开USB-CAN-A_TOOL_2.0 上位机,选择对应COM口, 按下图所示 2000000 端口波特率,CAN波特率 500.000Kbps,即可发送CAN消息至Esp32-s3-touch-lcd-4.3
- 打开串口调试助手,可以看到Esp32-s3-touch-lcd-4.3已经开始接收CAN消息(若接收报错,可多进行几次复位与软件重新开启设备,耐心等待)
LVGL UI
LVGL(Light and Versatile Graphics Library) 是一个轻量级、可移植的图形界面库,专为嵌入式系统设计,主要用于创建丰富的图形用户界面(GUI)。通过LVGL,用户可以轻松创建图形界面,并将硬件控制与界面交互结合起来,实现更加灵活的UI和硬件控制。
- 核心特点:
- 轻量级:适合资源受限的设备(低内存、低性能MCU)。
- 模块化:包含按钮、滑块、图表等丰富的UI控件。
- 事件驱动:通过捕获用户输入(如触摸屏、鼠标)触发控件的回调函数。
- 跨平台:支持多种硬件和操作系统,可通过驱动适配显示屏和输入设备。
- 多功能:支持动画、主题、字体、矢量图形和多种分辨率。
- 工作流程:
- 绘制界面:用户通过API创建和布局控件(如按钮、开关)。
- 输入事件:捕获触摸或鼠标输入,触发对应的控件事件。
- 事件回调:通过回调函数处理用户操作(如开关LED)。
- 任务调度:lv_task_handler() 定期刷新界面,确保显示和交互同步
lvgl_Porting
lvgl_Porting 示例,用于测试RGB触摸屏幕的使用
- 烧录代码后,可进行一系列触屏操作,是可供用户LVGL移植的例程(若烧录代码后,屏幕无反应,可查看是否有在Arduino IDE -> Tools正确配置:选择对应 Flash(8MB) 和使能 PSRAM(8MB OPI))
DrawColorBar
DrawColorBar 示例,用于测试RGB屏幕的使用
- 烧录代码后,可观察屏幕显示蓝色、绿色、红色的色带(若烧录代码后,屏幕无反应,可查看是否有在Arduino IDE -> Tools正确配置:选择对应 Flash(8MB) 和使能 PSRAM(8MB OPI))
VS Code 配置 ESP-IDF 开发
ESP-IDF环境搭建
其它说明
- 目前在 ESP-IDF v5.3 下使用单核跑 LVGL benchamark 示例的平均帧率上限为 26, 对应接口帧率为 41 (PCLK 21 MHz),编译前需要通过menuconfig 对ESP32 跟 LVGL进行配置:
CONFIG_FREERTOS_HZ=1000 CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y CONFIG_ESPTOOLPY_FLASHMODE_QIO=y CONFIG_ESPTOOLPY_FLASHFREQ_120M=y [需要与 PSRAM 保持一致] CONFIG_SPIRAM_MODE_OCT=y CONFIG_IDF_EXPERIMENTAL_FEATURES=y and CONFIG_SPIRAM_SPEED_120M=y [需要与 FLASH 保持一致] CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y CONFIG_SPIRAM_RODATA=y CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y CONFIG_COMPILER_OPTIMIZATION_PERF=y #以下 LVGL 配置项对帧率提升有帮助 (LVGL v8.3): #define LV_MEM_CUSTOM 1 or CONFIG_LV_MEM_CUSTOM=y #define LV_MEMCPY_MEMSET_STD 1 or CONFIG_LV_MEMCPY_MEMSET_STD=y #define LV_ATTRIBUTE_FAST_MEM IRAM_ATTR or CONFIG_LV_ATTRIBUTE_FAST_MEM=y
- 详细 LCD 及 LVGL 性能说明,请参考文档。
- PH2.0 锂电池座子只支持单节 3.7V 锂电池,勿使用多组电池包同时接入充放电,建议单节容量在 2000mAH 以下
安装VSCode
- 打开VSCode官网的下载页面,选择对应系统和系统位数进行下载
- 运行安装包后,其余均可以默认安装,但这里为了后续的体验建议,建议在此处勾选框中的1、2、3项
- 第一二项开启后,可以直接通过鼠标右键文件或者目录打开VSCode,可以提高后续的使用体验.
- 第三项开启后,选择打开方式时,可以直接选择VSCode
安装Python环境
- 首先,前往Python官网下载Python 3.11。你也可以在Microsoft Store商店下载,这样无需手动配置环境变量。
- 也可以点击我们下载好的:python 3.11.9
- 勾选"Add python.exe to PATH",将Python加入系统的环境变量。
- 选择自己想要的安装路径,点击"Customize installation",其他配置参考下图:
- 安装完成后,检查一下安装是否成功:win+r ->输入cmd -> python --version,出现下图的信息,则安装成功
安装Espressif IDF插件
- 注:当前插件最新版本为V1.7.1,为体验一致,用户可以选择与我们一样的版本,考虑到网络问题无法下载esp-idf,我们提供了离线包。
版本 描述 下载 esp-idf esp-idf V5.3离线包 百度网盘链接
- 在一个非中文路径下新建一个名为esp的文件夹,将下载好的v5.3-dev.exe放入该文件夹内。双击运行该文件,然后点击Extract以开始解压。
- 解压完成后,创建一个存放编译工具的文件夹在解压后的文件夹中,名为Espressif
- 打开VSCode,使用快捷键Shift+Ctrl+X,进入插件管理器
- 在搜索栏中,输入Espressif IDF,选择对应的插件点击 install即可
- 使用快捷键F1,输入
esp-idf: configure esp-idf extension
- 选择express(此教程针对第一次安装的用户,故只讲述初次的通用安装教程)
- 打开后显示该界面
- 我们按照下图进行设置,配置完成后,点击 install 进行下载:
- 进入下载页面,其会自动安装对应工具与环境,稍等片刻即可,安装完成后,会进入以下界面,说明安装完成:
- 注意:如果之前有安装过ESP-IDF,或者失败过的,请务必彻底删除文件或者创建全新的无中文路径
创建例程
- 我们将以使用官方例程为例来进行演示。
- 使用快捷键F1,输入
esp-idf:show examples projects
- 选择你当前的IDF版本
- 以Hello world例程为例
- 选择放置例程的路径,要求无例程同名文件夹
②其readme会说明该例程适用于什么芯片(下文有介绍例程怎么使用与文件结构,这里略)
③点击创建例程
设置COM口
修改驱动对象
- 此处显示的是使用的驱动对象,点击可以修改对应驱动对象
- 选择使用的工程或者例程
- 点击后需要稍等片刻
- 选择我们需要驱动的对象,也就是我们的主芯片为ESP32S3
- 选择openocd的路径,这里选择USB JTAG
- USB Bridge 是一种通用的接口转换工具,用于将 USB 转换为其他类型的接口,适用于各种设备间的通信和调试。
- USB JTAG 是一种专用的调试和编程工具,专门用于集成电路的调试和编程,提供硬件级别的测试和诊断功能。
状态栏简介
①SDK 配置编辑器,ESP-IDF很多功能与配置可以在其内修改
②全部清理,清空所有编译文件,
③编译
④当前下载方式,默认为UART
⑤烧录当前固件,请在编译后进行
⑥打开串口监视器,用于查看串口信息
⑦编译,烧录,打开串口监视器 一体按键(调试时最常用)
编译、烧录、串口监视
- 点击我们之前介绍的 编译,烧录,打开串口监视器按键
- 编译可能需要较长时间才能完成,尤其是在第一次编译时。
- 在此过程中,ESP-IDF可能会占用大量CPU资源,因此可能会导致系统卡顿。
- 因为我们使用的是USB芯片,并且板载自动下载电路,无需手动操作即可自动下载
- 下载成功后,自动进入串口监视器,可以看到芯片输出对应的信息并提示10S后重启
ESP-IDF示例程序
快速使用
我们想要测试屏幕基本功能,需要完成以下步骤:
- 首先下载示例程序并解压。(注意:不要存放中文路径下)
- 进入ESP32-S3-Touch-LCD-4.3_Code\ESP-IDF-5.3.0lvgl_Porting路径下,右键空白处通过vscode打开。
- 按照搭建环境《设置COM口》部分的步骤设置端口、开发板类型等。
- 下载成功后,效果如下(实际运行效果没有鼠标箭头,直接触摸即可):
程序目录
为了方便后续开发,我们首先要了解目录结构
├── bin ---------------------------------- lvgl适配ESP32的固件 ├── commponents -------------------------- 触摸屏GT911的驱动.LVGL库文件和LVGL示例程序等 ├── main --------------------------------- 程序的主函数部分 ├── sdkconfig ---------------------------- sdk相关设置,需要去SDK配置编译器中设置(状态栏部分) └── build -------------------------------- 编译后生成的文件,清除编译就会删除此文件夹
主程序简介
如果我们想进行二次开发,只需修改 rgb_lcd_example_main.c 程序,屏幕的初始化部分已经完成。
1.引脚设置
设置触摸芯片的接口和RGB565接口。
#define I2C_MASTER_SCL_IO 9 /*!< GPIO number used for I2C master clock */ #define I2C_MASTER_SDA_IO 8 /*!< GPIO number used for I2C master data */ #define EXAMPLE_PIN_NUM_HSYNC 46 #define EXAMPLE_PIN_NUM_VSYNC 3 #define EXAMPLE_PIN_NUM_DE 5 #define EXAMPLE_PIN_NUM_PCLK 7 #define EXAMPLE_PIN_NUM_DATA0 14 // B3 #define EXAMPLE_PIN_NUM_DATA1 38 // B4 #define EXAMPLE_PIN_NUM_DATA2 18 // B5 #define EXAMPLE_PIN_NUM_DATA3 17 // B6 #define EXAMPLE_PIN_NUM_DATA4 10 // B7 #define EXAMPLE_PIN_NUM_DATA5 39 // G2 #define EXAMPLE_PIN_NUM_DATA6 0 // G3 #define EXAMPLE_PIN_NUM_DATA7 45 // G4 #define EXAMPLE_PIN_NUM_DATA8 48 // G5 #define EXAMPLE_PIN_NUM_DATA9 47 // G6 #define EXAMPLE_PIN_NUM_DATA10 21 // G7 #define EXAMPLE_PIN_NUM_DATA11 1 // R3 #define EXAMPLE_PIN_NUM_DATA12 2 // R4 #define EXAMPLE_PIN_NUM_DATA13 42 // R5 #define EXAMPLE_PIN_NUM_DATA14 41 // R6 #define EXAMPLE_PIN_NUM_DATA15 40 // R7
2.分辨率设置
设置分斌率为800(水平)X480(垂直)
#define EXAMPLE_LCD_H_RES 800 #define EXAMPLE_LCD_V_RES 480
3. LVGL 的任务调度
在 ESP-IDF 框架中,FreeRTOS 是作为基础操作系统运行的。ESP-IDF 使用 FreeRTOS 来管理任务调度、内存管理、同步和通信等操作。当使用 LVGL 时,需要确保 LVGL 的任务调度与 FreeRTOS 一致。
example_lvgl_lock(int timeout_ms) //用于增加 LVGL 的时间滴答计数器 example_lvgl_lock(int timeout_ms) //用于获取一个递归互斥量(mutex),以确保在调用 LVGL 的 API 时的线程安全 example_lvgl_unlock(void) //管理线程安全的 API 调用 example_lvgl_port_task(void *arg) //定期处理 LVGL 的定时任务
4. 初始化LCD设备
初始化LCD设备主要定义在app_main函数中。
ESP_LOGI(TAG, "Install RGB LCD panel driver"); esp_lcd_panel_handle_t panel_handle = NULL; esp_lcd_rgb_panel_config_t panel_config = { .data_width = 16, // RGB 接口的数据线位数16-bit RGB565 .psram_trans_align = 64, // 默认64即可 .num_fbs = EXAMPLE_LCD_NUM_FB, //RGB 接口的帧缓存数量,默认设为 `1`,大于 `1` 时用于实现多缓冲防撕裂 #if CONFIG_EXAMPLE_USE_BOUNCE_BUFFER //用于提升 RGB 接口的数据传输带宽,通常设为 `10 * EXAMPLE_LCD_H_RES` .bounce_buffer_size_px = 10 * EXAMPLE_LCD_H_RES, #endif .clk_src = LCD_CLK_SRC_DEFAULT, .disp_gpio_num = EXAMPLE_PIN_NUM_DISP_EN, //连接 LCD DISP 信号的引脚编号,设置为 -1 表示不使用 .pclk_gpio_num = EXAMPLE_PIN_NUM_PCLK, //连接 LCD PCLK 信号的引脚编号 .vsync_gpio_num = EXAMPLE_PIN_NUM_VSYNC, //连接 LCD VSYNC 信号的引脚编号 .hsync_gpio_num = EXAMPLE_PIN_NUM_HSYNC, //连接 LCD HSYNC 信号的引脚编号 .de_gpio_num = EXAMPLE_PIN_NUM_DE, .data_gpio_nums = { EXAMPLE_PIN_NUM_DATA0, EXAMPLE_PIN_NUM_DATA1, EXAMPLE_PIN_NUM_DATA2, EXAMPLE_PIN_NUM_DATA3, EXAMPLE_PIN_NUM_DATA4, EXAMPLE_PIN_NUM_DATA5, EXAMPLE_PIN_NUM_DATA6, EXAMPLE_PIN_NUM_DATA7, EXAMPLE_PIN_NUM_DATA8, EXAMPLE_PIN_NUM_DATA9, EXAMPLE_PIN_NUM_DATA10, EXAMPLE_PIN_NUM_DATA11, EXAMPLE_PIN_NUM_DATA12, EXAMPLE_PIN_NUM_DATA13, EXAMPLE_PIN_NUM_DATA14, EXAMPLE_PIN_NUM_DATA15, }, .timings = { .pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ, .h_res = EXAMPLE_LCD_H_RES, .v_res = EXAMPLE_LCD_V_RES, // The following parameters should refer to LCD spec .hsync_back_porch = 8, .hsync_front_porch = 8, .hsync_pulse_width = 4, .vsync_back_porch = 16, .vsync_front_porch = 16, .vsync_pulse_width = 4, .flags.pclk_active_neg = true, }, .flags.fb_in_psram = true, // allocate frame buffer in PSRAM }; /* 初始化LCD设备 */ ESP_ERROR_CHECK(esp_lcd_new_rgb_panel(&panel_config, &panel_handle)); ESP_LOGI(TAG, "Register event callbacks"); esp_lcd_rgb_panel_event_callbacks_t cbs = { .on_vsync = example_on_vsync_event, }; ESP_ERROR_CHECK(esp_lcd_rgb_panel_register_event_callbacks(panel_handle, &cbs, &disp_drv)); ESP_LOGI(TAG, "Initialize RGB LCD panel"); ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); #if EXAMPLE_PIN_NUM_BK_LIGHT >= 0 ESP_LOGI(TAG, "Turn on LCD backlight"); gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL); #endif ... ...
5. 二次开发
通过分析主程序,我们可以发现,在开发LVGL程序时,只需在下方添加自己的功能函数即可。
if (example_lvgl_lock(-1)) { // example_lvgl_demo_ui(disp); lv_demo_widgets(); // lv_demo_benchmark(); // lv_demo_music(); // lv_demo_stress(); // Release the mutex example_lvgl_unlock(); }
6. 创建自己LVGL示例程序
- 进入conponents/lvgl_lvgl/examples/get_started目录。
output/ ├── examples │ ├── get_started │ ├── lv_example_get_started_1.c --------------------- 创建带有标签并响应点击事件的按钮C程序 │ ├── lv_example_get_started_1.py -------------------- 创建带有标签并响应点击事件的按钮Python程序 │ ├── lv_example_get_started_2.c --------------------- 从头开始设计按钮样式C程序 │ ├── lv_example_get_started_2.py -------------------- 从头开始设计按钮样式Python程序 │ ├── lv_example_get_started_3.c --------------------- 创建滑块,并在标签上显示其值 │ └── lv_example_get_started_3.py -------------------- 创建滑块,并在标签上显示其值 │ └── lv_example_get_started.h ----------------------- 头文件 └── layouts └── ...
- 右键get_started目录,New File新建文件并命名为lv_example_get_started_hello.c
- 程序内容如下:
#include "../lv_examples.h" #include "lv_conf.h" #if LV_BUILD_EXAMPLES && LV_USE_LABEL /** * Basic example to create a "Hello world" label */ void lv_example_get_started_hello(void) { /*Change the active screen's background color*/ lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x003a57), LV_PART_MAIN); /*Create a white label, set its text and align it to the center*/ lv_obj_t * label = lv_label_create(lv_scr_act()); lv_label_set_text(label, "Hello world"); // lv_label_set_text(label, LV_SYMBOL_POWER); lv_obj_set_style_text_color(lv_scr_act(), lv_color_hex(0xffffff), LV_PART_MAIN); lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); } #endif
- 在头文件里面也要定义lv_example_get_started_hello()函数。
void lv_example_get_started_1(void); void lv_example_get_started_2(void); void lv_example_get_started_3(void); void lv_example_get_started_hello(void);
- 将创建的函数填入主程序中:
if (example_lvgl_lock(-1)) { // example_lvgl_demo_ui(disp); //lv_demo_widgets(); // lv_demo_benchmark(); // lv_demo_music(); // lv_demo_stress(); // Release the mutex void lv_example_get_started_hello(); example_lvgl_unlock(); }
- 下载程序,实现现象:
7. 更多的LVGL示例程序
- 想要开发更多的示例程序可以访问LVGL官网:
描述 | 链接地址 | |
示例程序 | https://docs.lvgl.io/8.3/examples.html |
串口测试
UART_Test 示例,用于测试UART 接口的使用,此接口连接GPIO43(TXD)、GPIO44(RXD) 作 UART0 使用
- 烧录代码后,USB to Type C线接入“UART”Type C接口,打开串口调试助手,送消息给ESP32-S3-Touch-LCD-7,ESP32-S3-Touch-LCD-7会把收到的消息返回给串口调试助手,注意需要选择正确的COM口和波特率,发送消息前勾选“加回车换行/AddCrLf”
Sensor_AD
Sensor_AD 示例,用于测试Sensor AD 座子的使用,此接口连接 GPIO6 作 ADC 使用,可以接入 Sensor套件等器件
- 烧录代码后,Sensor AD座子连接“HY2.0 2P 转杜邦公头 3P 10cm”,可打开串口调试助手观察AD引脚读取的数据,ADC analog value为读取的ADC模拟值,ADC millivolts value为ADC转化的毫伏值
- 将AD引脚与GND引脚短接,读取的值如下图所示:
- 将AD引脚与3V3引脚短接,读取的值如下图所示:
I2C_Test
I2C_Test 示例,用于测试I2C 座子的使用,扫描各种I2C设备的地址
- 烧录代码后,连接 I2C设备(本文使用BME680 Environmental Sensor) 和 ESP32-S3-Touch-LCD-7 对应引脚,打开串口调试助手 选择 115200 波特率打开选择对应 COM 口通信(可先将ESP-IDF的COM口关闭,否则会占用COM口导致无法打开串口)
- 按下 ESP32-S3-Touch-LCD-7 的 Reset 按键,SSCOM 会打印信息,按如下图所示输入 i2cdetect ,则会打印 77,I2C 座子测试通过
RS485_Test
RS485_Test 示例,用于测试RS 485座子的使用
- 烧录代码后,对应连接 USB TO RS485 和 ESP32-S3-Touch-LCD-7 的 A 和 B 引脚,USB TO RS485 连接电脑后打开 串口调试助手 选择对应 COM 口通信
- 按如下图所示选择 115200 波特率,发送任意字符则会回环显示,RS485座子测试通过
TWAItransmit
TWAItransmit 示例,用于测试CAN卡座的使用,此接口连接GPIO20(TXD)、GPIO19(RXD) 作 CAN通讯 使用
- 烧录代码后,使用 “HY2.0 2P 转杜邦公头 2P 红黑 10cm” 线缆对应连接 ESP32-S3-Touch-LCD-7 和 USB-CAN-A 的 CAN H 和 CAN L引脚
- 打开串口调试助手,可以看到Esp32-s3-touch-lcd-7已经开始发送CAN消息
- USB-CAN-A 连接电脑,打开USB-CAN-A_TOOL_2.0 上位机,选择对应COM口, 按下图所示 2000000 端口波特率,CAN波特率 50.000Kbps,即可看到Esp32-s3-touch-lcd-7发送的CAN消息
TWAIreceive
TWAIreceive 示例,用于测试CAN卡座的使用,此接口连接GPIO20(TXD)、GPIO19(RXD) 作 CAN通讯 使用
- 烧录代码后,使用 “HY2.0 2P 转杜邦公头 2P 红黑 10cm” 线缆对应连接 ESP32-S3-Touch-LCD-7 和 USB-CAN-A 的 CAN H 和 CAN L引脚
- USB-CAN-A 连接电脑,打开USB-CAN-A_TOOL_2.0 上位机,选择对应COM口, 按下图所示 2000000 端口波特率,CAN波特率 500.000Kbps,即可发送CAN消息至Esp32-s3-touch-lcd-7
- 打开串口调试助手,可以看到Esp32-s3-touch-lcd-7已经开始接收CAN消息(若接收报错,可多进行几次复位与软件重新开启设备,耐心等待)
资料
产品尺寸
文档
演示视频
程序
软件
数据手册
FAQ
①重新启动UCANV2.0.exe中COM口,多按几次ESP32-S3-Touch-LCD-4.3复位键
②将串口调试助手上的“DTR”、“RTS”的勾选去掉
若烧录代码后,屏幕无反应,可查看是否有在Arduino IDE -> Tools正确配置:选择对应 Flash(8MB) 和使能 PSRAM(8MB OPI))
安装库的路径出现中文导致检索不到库文件