CH32V307VCT6使用ST7735S+LVGL
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 = 128LCD_H = 160
3.2 初始化流程
在 LCD/ST7735S.c 的 ST7735S_Init():
- GPIO 初始化
- SPI2 初始化
- 硬复位
- ST7735S 寄存器初始化(
0x11,0xB1~0xE1,0x3A等) - 设置旋转
ST7735_SetRotation(0) - 开显示
0x29 - 全屏清屏并开背光
3.3 像素块写入接口
LVGL flush 回调最终调用:
ST7735S_DrawImageRGB565(x, y, width, height, img)
该函数按 RGB565 字节流写入 GRAM。
4. LVGL 配置
-
LVGL下载:https://github.com/lvgl/lvgl/tree/release/v9.4
-
项目里创建文件并命名为lvgl_v9.4
-
将lv_conf_template.h改名为lv_conf.h并复制到lvgl_v9.4目录下
在 lvgl_v9.4/lv_conf.h 的已启用关键项:
LV_COLOR_DEPTH = 16LV_MEM_SIZE = 32 * 1024LV_DEF_REFR_PERIOD = 20 msLV_DRAW_LAYER_SIMPLE_BUF_SIZE = 8 * 1024LV_DRAW_LAYER_MAX_MEMORY = 16 * 1024LV_FONT_MONTSERRAT_14 = 1- 默认字体:
LV_FONT_DEFAULT = &lv_font_montserrat_14
5. LVGL 显示端口移植
User/main.c 当前流程:
ST7735S_Init()初始化 LCDlv_init()LVGL_PortInit()创建 display 并设置 flushLVGL_LoadExampleScreen()创建示例控件- 主循环周期执行
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_gfxlvgl_v9.4/lvgl/src/drivers/display/tft_espilvgl_v9.4/lvgl/src/libs/thorvglvgl_v9.4/lvgl/src/libs/gltflvgl_v9.4/lvgl/src/others/vg_lite_tvglvgl_v9.4/lvgl/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpplvgl_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 字体显示异常/发虚/颜色不对
优先检查:
LV_COLOR_DEPTH是否为 16- display color format 是否为
LV_COLOR_FORMAT_RGB565 - flush 中是否做了正确的 RGB565 字节序处理
- 标签是否显式设置字体和颜色(避免主题影响)
7.2 只有英文正常,中文乱码/方框
当前默认字体是 montserrat(英文)。需要中文时:
- 在
lv_conf.h打开 CJK 字体宏 - 给对应控件设置 CJK 字体
- 评估 Flash/RAM 增量
7.3 编译报 C 工程包含 C++ 源
检查 .cproject 的 sourceEntries/excluding 是否使用新路径前缀 lvgl_v9.4/lvgl/src/...。
7.4 屏幕闪烁或花屏
- 确认应用层没有周期性开关背光
- SPI 先用保守分频(当前
/8) - 初始化后先清屏
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路径 - 字体宏与实际显示语言一致
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)