前言
没想到这个系列还有续集,这次是为了WIFI6站未来,再包一顿饺子。PCB是自己画的,屏幕和esp32c6核心板都是某信买的。本文主要用于记录整个适配的过程,仅供参考。
效果
硬件
如标题所示,主要用到的是下面这两个器件
ESP32-C6是乐鑫科技首款集成Wi-Fi 6+Bluetooth 5(LE)的32位RISC-V SoC,具有极低功耗和高性价比,能够大幅提升物联网设备的Wi-Fi传输效率,提供安全可靠的连接性能。
硬件连接如下所示
软件环境依赖
- ESP-IDF 5.4
- Git
- VSCODE
驱动移植适配
根据本教程操作,不到1小时轻松点亮
1、获取示例工程
注意:这步需要能够正常访问Github,如果拉取代码失败需要检查网络环境。我拉取的是master分支,不同版本可能会有差异
git clone --recurse-submodules https://github.com/lvgl/lv_port_esp32.git
成功后如下图所示
2、配置项目
芯片平台配置
点一下下面的芯片平台和端口,给改成ESP32C6
下载调试端口根据实际情况修改,我这是直接用的USB,没用usb转串口(没用CH340)
改好长这样
LVGL配置
改屏幕的基本参数,我这个屏幕的话是改成240*240
这款屏幕用这套参数
下面这个参数控制要不要显示cpu占用率和FPS
ST7789屏幕驱动配置
实际验证ST7789V这个驱动芯片可以直接使用官方的驱动进行驱动,需要额外开发的代码很少,先改SDK的默认配置,如下所示
接下来就是根据硬件电路的连接调整对应的功能引脚配置,参考如下:
调完记得点下保存
3、编译&移植项目
修改完上述的问题后可以尝试进行首次编译,不出意外应该会报下面的错
接口改名
D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_tft/st7789.c: In function 'st7789_init':
D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_tft/st7789.c:91:5: error: implicit declaration of function 'gpio_pad_select_gpio'; did you mean 'esp_rom_gpio_pad_select_gpio'? [-Wimplicit-function-declaration]
91 | gpio_pad_select_gpio(ST7789_DC);
| ^~~~~~~~~~~~~~~~~~~~
| esp_rom_gpio_pad_select_gpio
D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_tft/st7789.c:107:22: error: 'portTICK_RATE_MS' undeclared (first use in this function); did you mean 'portTICK_PERIOD_MS'?
107 | vTaskDelay(100 / portTICK_RATE_MS);
| ^~~~~~~~~~~~~~~~
| portTICK_PERIOD_MS
这个是因为demo项目是基于ESP-IDF的4.4,而在ESP-IDF5.x中,这个函数和定义名已经改了,需要将gpio_pad_select_gpio
全局替换成 esp_rom_gpio_pad_select_gpio
,如下图所示
portTICK_RATE_MS
也需要替换为新版本库中的portTICK_PERIOD_MS
SPI硬件适配
这部分代码报错是因为demo不支持ESP32C6导致的,差异主要是硬件上带来的,需要修改代码逻辑以支持
In file included from D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_helpers.c:11:
D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_helpers.c: In function 'lvgl_spi_driver_init':
D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_helpers.c:219:51: error: 'spi_names' undeclared (first use in this function)
219 | ESP_LOGI(TAG, "Configuring SPI host %s (%d)", spi_names[host], host);
| ^~~~~~~~~
以上的报错需要修改components/lvgl_esp32_drivers/lvgl_helpers.c
,异常的原因是没有支持ESP32C6的SPI通道
In file included from D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_helpers.h:17,
from D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_helpers.c:10:
D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_helpers.c: In function 'lvgl_driver_init':
D:/CSDN/lv_port_esp32/components/lvgl_esp32_drivers/lvgl_spi_conf.h:68:22: error: 'HSPI_HOST' undeclared (first use in this function); did you mean 'SPI2_HOST'?
68 | #define TFT_SPI_HOST HSPI_HOST
| ^~~~~~~~~
这部分需要修改components\lvgl_esp32_drivers\lvgl_spi_conf.h
,VSPI和HSPI在ESP32C6的库里面没定义,这里直接改成1就行
库编译问题
D:/CSDN/lv_port_esp32/main/main.c: In function 'guiTask':
D:/CSDN/lv_port_esp32/main/main.c:142:11: error: unknown type name 'esp_timer_create_args_t'
142 | const esp_timer_create_args_t periodic_timer_args = {
| ^~~~~~~~~~~~~~~~~~~~~~~
以上问题在main.c
里面多加个esp_timer.h
头文件
4、解决运行时异常
完成上述步骤后,不出意外下载后应该会出现内核panic(单片机的赛博内核崩了)
这个异常的原因是运行时的CPU内核配置有问题,C6是个单核心处理器,只有CPU0,demo里面是将ui放在CPU1上运行导致的异常
修改完不出意外又崩了
这个问题是SPI通道配置的问题,C6上使用SPI+DMA需要将components\lvgl_esp32_drivers\lvgl_helpers.c
中的这部分代码改为自动DMA通道SPI_DMA_CH_AUTO
修改完上述问题后,再次烧录就不会再报错了
5、屏幕驱动调整
如果你和我用的是同款屏幕,到这里不出意外的话这个屏幕应该还是黑着的,只有背光亮了
这一步我一度怀疑是我的硬件有问题,毕竟代码运行没有报错,后面我实际用示波器测量了SPI上数据和时钟线的波形,发现实际的波形与屏幕手册上的不符合,需要对下面的代码做调整(说好的ST7789兼容ST7789V呢…😅😅😅)
改好后再下载,屏幕轻松点亮,默认跑的是demo