CH32V307VCT6使用ST7735S + LVGL v9.4

完整代码

链接: https://pan.baidu.com/s/1DqY6ulpo5mkEzUvGOWCUSQ?pwd=gtyg 提取码: gtyg

1. 关键文件

  • LCD 分辨率/引脚定义: LCD/config.h
  • ST7735S 驱动: LCD/ST7735S.c, LCD/ST7735S.h
  • SPI2 驱动: LCD/SPI.c
  • LVGL 配置: lvgl_v9.4/lv_conf.h
  • LVGL 端口与示例: User/main.c
  • 工程排除配置: .cproject, CH32V307VCT.wvproj

2. 硬件连接

来自 LCD/config.h 与驱动注释:

  • LCD_BLK: PB9
  • LCD_DC: PB10
  • LCD_RST: PB11
  • LCD_CS: PB12
  • LCD_SCL (SPI2_SCK): PB13
  • LCD_SDA (SPI2_MOSI): PB15

SPI2 初始化在 LCD/SPI.c,当前关键设置:

  • 主模式、1 线发送、8 位数据
  • CPOL=Low, CPHA=1Edge
  • 波特率分频: SPI_BaudRatePrescaler_8(联调稳定优先)

3. ST7735S 驱动配置

3.1 分辨率

LCD/config.h

  • LCD_W = 128
  • LCD_H = 160

3.2 初始化流程

LCD/ST7735S.cST7735S_Init()

  1. GPIO 初始化
  2. SPI2 初始化
  3. 硬复位
  4. ST7735S 寄存器初始化(0x11, 0xB1~0xE1, 0x3A 等)
  5. 设置旋转 ST7735_SetRotation(0)
  6. 开显示 0x29
  7. 全屏清屏并开背光

3.3 像素块写入接口

LVGL flush 回调最终调用:

  • ST7735S_DrawImageRGB565(x, y, width, height, img)

该函数按 RGB565 字节流写入 GRAM。

4. LVGL 配置

  1. LVGL下载:https://github.com/lvgl/lvgl/tree/release/v9.4

  2. 项目里创建文件并命名为lvgl_v9.4

  3. lv_conf_template.h改名为lv_conf.h并复制到lvgl_v9.4目录下

lvgl_v9.4/lv_conf.h 的已启用关键项:

  • LV_COLOR_DEPTH = 16
  • LV_MEM_SIZE = 32 * 1024
  • LV_DEF_REFR_PERIOD = 20 ms
  • LV_DRAW_LAYER_SIMPLE_BUF_SIZE = 8 * 1024
  • LV_DRAW_LAYER_MAX_MEMORY = 16 * 1024
  • LV_FONT_MONTSERRAT_14 = 1
  • 默认字体: LV_FONT_DEFAULT = &lv_font_montserrat_14

5. LVGL 显示端口移植

User/main.c 当前流程:

  1. ST7735S_Init() 初始化 LCD
  2. lv_init()
  3. LVGL_PortInit() 创建 display 并设置 flush
  4. LVGL_LoadExampleScreen() 创建示例控件
  5. 主循环周期执行 lv_tick_inc() + lv_timer_handler()

5.1 draw buffer 配置

#define LVGL_TICK_PERIOD_MS  (5u)
#define LVGL_DRAW_BUF_LINES  (16u)
static uint8_t g_lv_draw_buf1[LCD_W * LVGL_DRAW_BUF_LINES * 2u] = {0};

说明:当前缓冲大小为 128 * 16 * 2 = 4096 bytes

5.2 flush 回调要点(字节序)

由于 RGB565 在本屏链路下需要字节交换,当前在 flush 回调中先 swap 再写屏:

LVGL_SwapRGB565Bytes(px_map, pixel_count);
ST7735S_DrawImageRGB565(x1, y1, width, height, px_map);
lv_display_flush_ready(disp);

如果你后续更换屏驱或总线,需重新确认是否仍需要 swap。

5.3 display 注册

g_lv_disp = lv_display_create(LCD_W, LCD_H);
lv_display_set_color_format(g_lv_disp, LV_COLOR_FORMAT_RGB565);
lv_display_set_flush_cb(g_lv_disp, LVGL_FlushCB);
lv_display_set_buffers(g_lv_disp, g_lv_draw_buf1, 0, sizeof(g_lv_draw_buf1), LV_DISPLAY_RENDER_MODE_PARTIAL);

6. 工程配置

6.1 include path

当前工程包含 lvgl_v9.4 路径。

注意:若仅加入 lvgl_v9.4,在 User/main.c 中可使用相对包含:

#include "../lvgl_v9.4/lvgl/lvgl.h"

6.2 排除 C++ 目录/文件

若出现 “Detected C++ source files in C project” 报错,需在 .cproject.wvproj 中同步排除以下路径(当前工程已配置):

  • lvgl_v9.4/lvgl/src/drivers/display/lovyan_gfx
  • lvgl_v9.4/lvgl/src/drivers/display/tft_espi
  • lvgl_v9.4/lvgl/src/libs/thorvg
  • lvgl_v9.4/lvgl/src/libs/gltf
  • lvgl_v9.4/lvgl/src/others/vg_lite_tvg
  • lvgl_v9.4/lvgl/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp
  • lvgl_v9.4/lvgl/src/libs/fsdrv/lv_fs_arduino_sd.cpp

.cproject

          <sourceEntries>
            <entry excluding="Startup/startup_ch32v30x_D8.S|lvgl_v9.4/lvgl/src/drivers/display/lovyan_gfx|lvgl_v9.4/lvgl/src/drivers/display/tft_espi|lvgl_v9.4/lvgl/src/libs/thorvg|lvgl_v9.4/lvgl/src/libs/gltf|lvgl_v9.4/lvgl/src/others/vg_lite_tvg|lvgl_v9.4/lvgl/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp|lvgl_v9.4/lvgl/src/libs/fsdrv/lv_fs_arduino_sd.cpp" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
          </sourceEntries>

在这里插入图片描述

.wvproj
在这里插入图片描述

7. 常见问题排查

7.1 字体显示异常/发虚/颜色不对

优先检查:

  1. LV_COLOR_DEPTH 是否为 16
  2. display color format 是否为 LV_COLOR_FORMAT_RGB565
  3. flush 中是否做了正确的 RGB565 字节序处理
  4. 标签是否显式设置字体和颜色(避免主题影响)

7.2 只有英文正常,中文乱码/方框

当前默认字体是 montserrat(英文)。需要中文时:

  1. lv_conf.h 打开 CJK 字体宏
  2. 给对应控件设置 CJK 字体
  3. 评估 Flash/RAM 增量

7.3 编译报 C 工程包含 C++ 源

检查 .cprojectsourceEntries/excluding 是否使用新路径前缀 lvgl_v9.4/lvgl/src/...

7.4 屏幕闪烁或花屏

  1. 确认应用层没有周期性开关背光
  2. SPI 先用保守分频(当前 /8
  3. 初始化后先清屏

8. 快速检查清单

  • LCD_W/LCD_H 与屏幕一致(128x160)
  • SPI2 接线与引脚定义一致
  • lv_init() 在 display 注册前调用
  • flush 回调最后调用 lv_display_flush_ready()
  • RGB565 字节序经过实机验证
  • lv_tick_inc()lv_timer_handler()按固定周期执行
  • .cproject.wvproj 排除项已同步为 lvgl_v9.4 路径
  • 字体宏与实际显示语言一致

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐