安信可ESP32 LVGL_V8 最快移植攻略
系列文章地址:ESP32 LVGLV7最快移植攻略
此篇为发稿前最新的移植,如需要Lvgl V7 可参考上文。
本文来自于安信可科技开发者据说这是zzy的分享~
软件环境
- VSCODE-ESP32-IDF4.4 插件版 支持ESP32-S3
- LVGL project for ESP32 master分支
- LVGL V8master分支
硬件环境
-
安信可 ESP-S3-12K开发板
-已上架淘宝,→戳这里购买← -
1.3TFT,插接版 ST7789
ESP-S3-12K开发板介绍
ESP-S3-12K-Kit 开发板是安信可针对 ESP-S3-12K 模组而设计的一款核心开发板, 该开发板延续了 NodeMCU 开发板的经典设计,引出全部 I/O 至两侧的排针,开发者可 以根据自己的需求连接外设。使用面包板进行开发和调试时,两侧的 2.54mm 间距排针 可以使操作更加简单方便。
开发板的参数
可以看到安信可ESP32-S3-12k开发板不仅板载了8M Byte的SPI Flash更搭配了8M Byte的Psram。
ESP32S3的SPI
ESP32-S3 共有四个 SPI(SPI0,SPI1,SPI2 和 SPI3)。SPI0 和 SPI1 可以配置成 SPI 存储器模式,SPI2 和 SPI3 可以配置成通用 SPI 模式。
SPI 存储器 (SPI Memory) 模式 SPI
存储器模式(SPI0 和 SPI1)用于连接 SPI 接口的外部存储器。SPI 存储器模式下数据传输长度以字节 为单位,最高支持八线 SDR/DDR(单数据采样沿/双数据采样沿)读写操作。时钟频率可配置,最高支持 OPI 120 MHz SDR/DDR 模式。
SPI2 通用 SPI (GPSPI) 模式
SPI2 既可以配置成主机模式,又可以配置成从机模式。主机模式支持双线全双工和单线、双线、四线或 八线半双工通信;从机模式支持双线全双工和单线、双线或四线半双工通信。通用 SPI 的主机时钟频率可 配置;数据传输长度以字节为单位;时钟极性 (CPOL) 和相位 (CPHA) 可配置;可连接 DMA 通道。
SPI3 通用 SPI (GPSPI) 模式
SPI3 既可以配置成主机模式,又可以配置成从机模式,具有双线全双工和单线、双线或四线半双工通信 功能,仅支持 SDR 读写操作。通用 SPI 的主机时钟频率可配置;数据传输长度以字节为单位;时钟极性 (CPOL) 和相位 (CPHA) 可配置;可连接 DMA 通道。
通常情况下,ESP32-S3 和 flash 芯片的数据端口连接关系是:
在安信可的模块中使用的是四线SPI,具体占用的引脚是:
对应的是GPIO是:
使用的时候需要注意,不能使用这几个引脚。当然能开发板上并没有引出这几个引脚,在一定程度上也做到了规避。
LVGL_V8移植指北
首先是源代码的下载:
你可以通过下载我移植好的代码直接使用或者从github上下载最新的代码(当然截至文章发布我的也是最新的代码)。
直接使用我的代码:
git的方式下载代码:
首先下载最新的LVGL V8,直接下载master分支即可:
git clone [email protected]:lvgl/lvgl.git
再下载最新的适用于ESP32的驱动:
git clone [email protected]:lvgl/lvgl_esp32_drivers.git
下载完成后可以看到文件夹下两个项目:
然后我们再来新建一个ESP32项目,这里为了简单,就新建一个blink项目:
选择blink项目,在合适的位置创建项目:
找到你创建的项目:
在项目目录下创建一个components文件夹:
将刚刚下载的代码放入项目文件夹:
再使用VScode打开项目文件夹:
你可以看到项目文件夹位置多出来的lvgl和驱动:
接下来我们来修改代码和配置项目:
首先是修改芯片型号:
点击下图位置
选择ESP32-S3:
再打开配置项目:
找到LVGL配置项目,如果你的配置项目没有LVGL请重新打开VSCode;
打开以后可以看见四个关键配置项目:
再点击对应驱动的配置项:
我这里使用的是ST7789V,所以我这里下边出现的是对应驱动的配置项目:
打开以后需要配置的脚如下:
注意这些是默认的脚,我们需要进行一些修改来适配S3:
因为ST7735S、ST7789在接收16位颜色值时是高位在前的16位短整型。而ESP32因为是小端模式,DMA在发送16位数据时,会先发低8位字节再发送高8位字节,这就造成了数据不一至!所以需要勾选一下,勾选后,就是调换了一下。如果你勾选了此选项造成颜色不对你可以不勾选。
如果你看到的不是白底黑字,而是颜色反过来的,你可以勾选这个选项来矫正颜色。
修改完成后配置项目基本就完成了。
接下来修改代码:
首先就是在 lvgl_helpers.h 的下面添加几个宏定义:
#define LV_HOR_RES_MAX 240
#define LV_VER_RES_MAX 240
#define SPI_HOST_MAX 3
再来修改一下lvgl_helpers.c的这个位置的代码:
将源代码修改成esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)SPI_DMA_CH_AUTO);
。
可以在这里先编一下,看一下会不会报错,如果没有报错就开始写lvgl的代码。
当然初始化LVGL的代码我已经写好了,就在项目里面,你可以直接Download下来使用:
下载后找到这两个文件放在main目录下:
他的路径就在:./main/…
单单添加文件并不能让他们参加编译我们还需要手动添加一下:
打开main目录下的CMAKELists,添加如下内容:
回到main.c:
添加头文件支持:
修改app_main函数,为其添加lvgl初始化线程:
void app_main(void)
{
/* Configure the IOMUX register for pad BLINK_GPIO (some pads are
muxed to GPIO on reset already, but some default to other
functions and need to be switched to GPIO. Consult the
Technical Reference for a list of pads and their default
functions.)
*/
xTaskCreatePinnedToCore(guiTask, "gui", 4096*2, NULL, 1, NULL, 1);
gpio_reset_pin(BLINK_GPIO);
/* Set the GPIO as a push/pull output */
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
while(1) {
/* Blink off (output low) */
printf("Turning off the LED\n");
gpio_set_level(BLINK_GPIO, 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);
/* Blink on (output high) */
printf("Turning on the LED\n");
gpio_set_level(BLINK_GPIO, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
再次编译,下载后就可以看到效果:
感谢本文作者据说这是zzy的分享~
阅读原文:https://blog.csdn.net/qq_20540901/article/details/123608655?spm=1001.2014.3001.5501