【ESP-IDF】ESP32C6使用ESP-IDF5.4驱动ST7789V

前言

没想到这个系列还有续集,这次是为了WIFI6站未来,再包一顿饺子。PCB是自己画的,屏幕和esp32c6核心板都是某信买的。本文主要用于记录整个适配的过程,仅供参考。

效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

硬件

如标题所示,主要用到的是下面这两个器件
ST7789V屏幕

ESP32-C6是乐鑫科技首款集成Wi-Fi 6+Bluetooth 5(LE)的32位RISC-V SoC,具有极低功耗和高性价比,能够大幅提升物联网设备的Wi-Fi传输效率,提供安全可靠的连接性能。

ESP32C6
硬件连接如下所示
在这里插入图片描述
在这里插入图片描述

软件环境依赖

  • 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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值