从零到显示:用LVGL在1.8寸ST7735S屏上显示自定义图片(RV1106/Luckfox平台)

张开发
2026/4/19 17:28:57 15 分钟阅读

分享文章

从零到显示:用LVGL在1.8寸ST7735S屏上显示自定义图片(RV1106/Luckfox平台)
从零到显示用LVGL在1.8寸ST7735S屏上实现嵌入式GUI开发RV1106实战指南当一块1.8寸的ST7735S屏幕在Luckfox RV1106开发板上点亮第一帧图像时那种成就感只有亲历过嵌入式开发的工程师才能体会。本文将带你完整走通从硬件连接到软件集成的全流程解决那些官方文档从未提及的坑点。1. 硬件连接与设备树配置ST7735S作为一款常见的SPI接口LCD其硬件连接看似简单却暗藏玄机。根据实测Luckfox Pico Pro Max开发板的SPI0接口引脚对应关系如下屏幕引脚开发板GPIO功能说明SCLGPIO1_PC1SPI时钟线SDAGPIO1_PC2SPI数据线CSGPIO1_PC3片选需软件控制BLGPIO2_PB0背光控制DCGPIO1_PD0数据/命令选择RESGPIO1_PD1复位信号关键设备树配置需要修改两个文件// rv1106-luckfox-pico-pro-max-ipc.dtsi spi0 { fbtft0 { compatible sitronix,st7735r; // 使用st7735r驱动兼容st7735s reg 0; spi-max-frequency 48000000; spi-cpol; spi-cpha; rotate 0; fps 30; dc gpio1 RK_PD0 GPIO_ACTIVE_HIGH; reset gpio1 RK_PD1 GPIO_ACTIVE_LOW; debug 0x1; }; };注意ST7735R驱动可以完美兼容ST7735S屏幕这是经过社区验证的解决方案。若直接使用st7735s兼容标识可能导致驱动加载失败。背光控制需要单独配置backlight: backlight { compatible gpio-backlight; pinctrl-names default; pinctrl-0 gpio2_pb0; gpios gpio2 RK_PB0 GPIO_ACTIVE_HIGH; default-on; };2. 内核驱动编译与调试确保内核配置包含以下关键选项CONFIG_SPI_MASTERy CONFIG_FBy CONFIG_FB_TFTy CONFIG_FB_TFT_ST7735Ry CONFIG_BACKLIGHT_GPIOy编译烧录后通过以下命令验证驱动是否正常加载dmesg | grep fb_ # 预期看到类似输出 # fb_st7735r spi0.0: fbtft_property_value: buswidth 8 # fb_st7735r spi0.0: fbtft_request_one_gpio: reset GPIO57屏幕测试命令# 花屏测试 cat /dev/urandom /dev/fb0 # 清屏测试 cat /dev/zero /dev/fb0 # 背光控制 echo 1 /sys/class/backlight/backlight/brightness3. LVGL开发环境搭建推荐使用LVGL v8.1.0稳定版本创建项目目录结构如下lvgl_project/ ├── lvgl/ # 核心库 ├── lv_drivers/ # 驱动适配 ├── lv_demos/ # 示例代码 ├── lv_conf.h # 主配置文件 ├── lv_drv_conf.h # 驱动配置文件 ├── main.c # 应用入口 └── Makefile # 交叉编译配置关键配置修改点// lv_conf.h #define LV_MEM_SIZE (32U * 1024) // 根据RV1106内存调整 #define LV_DISP_DEF_REFR_PERIOD 30 // 刷新周期匹配屏幕30fps #define LV_TICK_CUSTOM 0 // 不使用自定义tick // lv_drv_conf.h #define USE_FBDEV 1 // 启用FrameBuffer驱动交叉编译Makefile核心配置CC /path/to/arm-rockchip830-linux-uclibcgnueabihf-gcc CFLAGS -I$(LVGL_DIR) -Wall -O3 LDFLAGS -lm BIN demo4. 图片显示实战将PNG/JPG图片转换为LVGL可用的C数组推荐使用在线转换工具访问Online Image Converter选择图片文件输出格式选择PNG: CF_TRUE_COLOR_ALPHAJPG: CF_TRUE_COLOR下载生成的.c文件并加入工程在main.c中集成图片显示LV_IMG_DECLARE(my_image); // 声明转换后的图片 lv_obj_t * img lv_img_create(lv_scr_act()); lv_img_set_src(img, my_image); lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);完整的主循环实现while(1) { lv_timer_handler(); usleep(5000); // 5ms延迟减少CPU占用 }5. 性能优化技巧通过实际测试我们发现以下优化手段可提升20%以上的渲染性能帧缓冲配置#define DISP_BUF_SIZE (128 * 40) // 分段缓冲而非全屏缓冲 static lv_disp_draw_buf_t disp_buf; lv_disp_draw_buf_init(disp_buf, buf1, buf2, DISP_BUF_SIZE);SPI时钟优化// 设备树中调整SPI时钟 spi-max-frequency 48000000; // ST7735S最高支持80MHz双缓冲模式// 在驱动支持的情况下启用 disp_drv.full_refresh 0; disp_drv.direct_mode 0;6. 常见问题排查问题1屏幕白屏但背光亮起检查SPI时钟极性配置spi-cpol和spi-cpha需要与屏幕规格书一致验证DC引脚电平数据传输期间应有明显电平变化问题2图像显示错位// 调整旋转参数尝试不同方向 rotate 0; // 可选0,90,180,270问题3内存不足崩溃减少LVGL内存池大小禁用不需要的字体和特效使用更小的颜色深度如RGB565代替RGB8887. 进阶开发建议对于需要复杂UI的项目推荐采用以下架构状态机设计typedef enum { UI_STATE_HOME, UI_STATE_MENU, UI_STATE_SETTINGS } ui_state_t; void update_ui(ui_state_t state) { lv_obj_clean(lv_scr_act()); switch(state) { case UI_STATE_HOME: create_home_screen(); break; // ...其他状态处理 } }异步事件处理void event_handler(lv_event_t * e) { if(e-code LV_EVENT_CLICKED) { lv_obj_t * btn lv_event_get_target(e); uint32_t btn_id lv_btnmatrix_get_selected_btn(btn); // 处理按钮事件 } }内存监控void mem_monitor(lv_timer_t * timer) { static uint32_t max_used 0; uint32_t used LV_MEM_SIZE - lv_mem_get_free_size(); if(used max_used) { max_used used; printf(Peak memory usage: %d/%d\n, max_used, LV_MEM_SIZE); } }在实际项目中我发现ST7735S的SPI时序要求较为严格当布线长度超过10cm时需要降低时钟频率至30MHz以下才能稳定工作。另外LVGL的默认字体渲染会消耗较多资源对于中文显示建议预先提取所需字模而非启用完整字库。

更多文章