当前位置: 首页 > news >正文

【RV1106】基于SPI驱动ST7735S屏幕,移植LVGL实现图片显示全流程解析

1. 硬件准备与电路连接

在开始之前,我们需要准备好所有必要的硬件设备。Luckfox RV1106开发板是一款性能不错的嵌入式开发平台,而ST7735S是一款常见的1.8寸SPI接口LCD屏幕。我实际使用中发现,市面上常见的ST7735S屏幕引脚定义可能略有不同,所以一定要仔细核对你的屏幕规格书。

屏幕的典型引脚包括:

  • VCC:3.3V电源
  • GND:地线
  • SCL:SPI时钟线
  • SDA:SPI数据线
  • CS:片选信号
  • DC:数据/命令选择
  • RES:复位信号
  • BL:背光控制

连接时最容易出错的就是背光控制线。很多新手会忽略这个引脚,结果屏幕完全不亮。我踩过这个坑,当时还以为驱动有问题,折腾了半天才发现是背光没开。建议先用万用表测量背光引脚电压,确保硬件连接正确。

2. 设备树配置详解

设备树配置是驱动开发的关键一步。在Luckfox RV1106上,我们需要修改两个关键文件:rv1106g-luckfox-pico-pro-max.dts和rv1106-luckfox-pico-pro-max-ipc.dtsi。

首先在dts文件中添加背光驱动配置:

backlight:backlight{ compatible = "gpio-backlight"; pinctrl-names = "default"; pinctrl-0 = <&gpio2_pb0>; gpios = <&gpio2 RK_PB0 GPIO_ACTIVE_HIGH>; default-on; };

然后在dtsi文件中修改SPI配置:

fbtft@0{ status = "okay"; compatible = "sitronix,st7735r"; // 注意这里用st7735r兼容st7735s reg = <0>; spi-max-frequency = <48000000>; spi-cpol; spi-cpha; rotate = <0>; fps = <30>; rgb; buswidth = <8>; dc = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>; reset = <&gpio1 RK_PD1 GPIO_ACTIVE_LOW>; debug = <0x1>; };

这里有个关键点:官方驱动中st7735r可以完美兼容st7735s。我实测过多种屏幕,这个配置都能正常工作。如果遇到问题,可以尝试调整spi-max-frequency参数,降低到24MHz试试。

3. 内核驱动适配与修改

由于内核版本差异,我们可能需要修改fbtft驱动。主要改动集中在fbtft-core.c文件中:

  1. 添加必要的头文件:
#include <linux/gpio.h> #include <linux/of_gpio.h>
  1. 修改fbtft_request_one_gpio函数:
static int fbtft_request_one_gpio(struct fbtft_par *par, const char *name, int index, struct gpio_desc **gpiop) { // 详细实现参考原文 // 关键是要正确处理GPIO的active low配置 }
  1. 修改reset函数:
static void fbtft_reset(struct fbtft_par *par) { if (!par->gpio.reset) return; gpiod_set_value_cansleep(par->gpio.reset, 1); usleep_range(20, 40); gpiod_set_value_cansleep(par->gpio.reset, 0); msleep(120); gpiod_set_value_cansleep(par->gpio.reset, 1); msleep(120); gpiod_set_value_cansleep(par->gpio.cs, 0); // 激活芯片 msleep(120); }

修改完成后,记得在defconfig中启用相关配置:

CONFIG_BACKLIGHT_GPIO=y CONFIG_FB_TFT_ST7735R=y CONFIG_SPI_MASTER=y CONFIG_FB=y

4. 驱动验证与调试

编译并烧写系统后,可以通过以下命令验证驱动是否正常工作:

# 查看驱动加载信息 dmesg | grep fb_ # 测试花屏效果 cat /dev/urandom > /dev/fb0 # 清屏测试 cat /dev/zero > /dev/fb0 # 背光控制 echo 1 > /sys/class/backlight/backlight/brightness # 打开背光 echo 0 > /sys/class/backlight/backlight/brightness # 关闭背光

如果屏幕没有反应,建议按以下步骤排查:

  1. 检查背光是否点亮
  2. 测量各控制引脚电平
  3. 确认SPI时钟信号是否正常
  4. 查看dmesg输出是否有错误信息

5. LVGL环境搭建

LVGL是一个轻量级的嵌入式图形库,我们需要先准备开发环境:

# 创建工作目录 mkdir -p ~/lvgl_project/project_01 cd ~/lvgl_project/project_01 # 克隆LVGL相关仓库 git clone -b v8.1.0 https://github.com/lvgl/lvgl.git git clone -b v8.1.0 https://github.com/lvgl/lv_drivers.git git clone -b v8.1.0 https://github.com/lvgl/lv_demos.git git clone --branch release/v8.2 --single-branch https://github.com/lvgl/lv_port_linux_frame_buffer.git # 复制必要文件 cp -r lvgl lv_drivers lv_demos . cp lvgl/lv_conf_template.h ./lv_conf.h cp lv_drivers/lv_drv_conf_template.h ./lv_drv_conf.h cp lv_demos/lv_demo_conf_template.h ./lv_demo_conf.h cp lv_port_linux_frame_buffer/main.c . cp lv_port_linux_frame_buffer/Makefile .

6. LVGL配置修改

需要修改几个关键配置文件:

  1. lv_conf.h:
#define LV_MEM_SIZE (32U * 1024U) // 根据实际情况调整内存大小 #define LV_DISP_DEF_REFR_PERIOD 30 // 刷新周期 #define LV_INDEV_DEF_READ_PERIOD 30 // 输入设备读取周期 #define LV_USE_LOG 0 // 关闭日志减少开销
  1. lv_drv_conf.h:
#define USE_FBDEV 1 // 启用framebuffer驱动
  1. lv_demo_conf.h:
#define LV_USE_DEMO_WIDGETS 0 // 不使用示例组件

7. 图片显示实现

要在LVGL中显示图片,需要先将图片转换为C数组。可以使用在线转换工具,选择CF_TRUE_COLOR格式(JPG)或CF_TRUE_COLOR_ALPHA格式(PNG)。

转换完成后,将生成的.c文件添加到工程中,然后在main.c中使用:

LV_IMG_DECLARE(fll); // 声明外部图片 lv_obj_t * img1 = lv_img_create(lv_scr_act()); lv_img_set_src(img1, &fll); lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);

8. 编译与部署

使用交叉编译工具链编译程序:

make CC=arm-rockchip830-linux-uclibcgnueabihf-gcc

将生成的可执行文件复制到开发板,并运行:

chmod +x demo ./demo

如果遇到问题,可以尝试以下调试方法:

  1. 检查framebuffer设备是否正确初始化
  2. 确认图片数据格式与屏幕色彩模式匹配
  3. 调整LVGL的内存配置参数
  4. 查看系统资源使用情况,确保内存充足

在实际项目中,我发现ST7735S屏幕在低刷新率下可能会出现残影,可以通过调整fps参数和屏幕初始化序列来改善。另外,LVGL的内存管理需要特别注意,特别是在资源有限的嵌入式设备上,合理配置LV_MEM_SIZE对性能影响很大。

http://www.jsqmd.com/news/518103/

相关文章:

  • 北京上门收酒,地方老酒回收,京城亚南酒业不挑款,诚信全收 - 品牌排行榜单
  • 2026冲刺用!10个AI论文网站深度测评:论文写作全流程必备工具推荐
  • 2026化妆学校排行|零基础必看!避坑不踩雷,择校少走3年弯路 - 品牌测评鉴赏家
  • GPTK进阶指南:除了装游戏,这些Wine Prefix的维护技巧让你少走弯路
  • 2026年值得关注的化妆培训学校,新手必看 - 品牌测评鉴赏家
  • 手把手教你用2SK184搭建JFET共源放大电路(附Multisim仿真文件)
  • 鸿蒙分布式软总线:RPC协议如何重塑跨设备通信体验
  • 看完就会:开源免费AI论文软件,千笔写作工具 VS 灵感ai!
  • STM32调试神器Event Recorder:告别串口打印,5分钟搞定高效Debug(基于CubeMX)
  • 探索ANSYS-Simpack的柔性化处理
  • 别再让程序动不动就崩溃了!Python异常处理,你该这么玩!
  • 电机参数辨识就像给电机做CT扫描,不拆机就能摸清内部脾气。咱们今天直接上干货,撸起袖子从大厂实战代码里找门道
  • django《Python程序设计》课程智能问答系统 智能AI客服问答系统
  • STM32F10x标准库工程搭建避坑指南:从固件库下载到LED点亮全流程
  • GLM-OCR赋能Dify.AI:为低代码平台添加视觉理解能力
  • STC8G1K08A单片机ADC读取避坑指南:电位器模块连接与串口打印实战
  • 基于博途1200PLC + HMI水塔水位控制系统仿真探索
  • 地热井耐高温液位计源头生产厂家推荐 - WHSENSORS
  • 基于105报文DSC功能,实现博能传动伺服双轴高精度绝对同步
  • 手把手教你用Java搞定那个俄文论坛的注册验证码(ASCII八进制解码实战)
  • 讲讲2026年绍兴荷花苗芦苇苗一站式采购加工厂,排名前十有哪些 - myqiye
  • 光伏MPPT算法仿真:开启初学者的探索之旅
  • 基于线性自抗扰(LADRC)的无人船航向控制系统Simulink/Matlab仿真工程探索
  • 第四章 Direct3D的初始化
  • PFC - FLAC耦合柔性三轴体应变计算:Shell模拟柔性膜体积计算探秘
  • 总结水生植物苗大规模批发要点,徐州等地靠谱公司怎么选择 - mypinpai
  • Linux上下文切换机制与嵌入式性能优化
  • Comsol 光子晶体仿真:拓扑荷、BIC 与远场偏振的探索
  • 浙江地区杉原木桩批发费用,选购好用的杉木桩怎么选? - 工业设备
  • 别再手动翻OA了!泛微Ecology数据库里,用这3条SQL直接拉取你的待办、已办和办结清单