目录
[I2C 设备扫描工具的使用](#I2C 设备扫描工具的使用)
[1. 自动初始化入口](#1. 自动初始化入口)
[2. LVGL 线程初始化](#2. LVGL 线程初始化)
[3. LVGL 线程入口函数](#3. LVGL 线程入口函数)
[4. 测试程序入口](#4. 测试程序入口)
引言
厂商提供的RT-Thread Titan Board 开发板套件不包括屏幕,而我计划的项目必须有一个屏幕才行,从某宝买了一个4.3寸RGB LCD触摸屏,这两天到货了,来测试一下。本文将分享项目测试过程中的经验。
LCD屏硬件接口
开发板的LCD屏接口如下:

这实际上是正点原子定义的LCD屏幕的管脚定义:


某宝上有大量和正点原子兼容的屏幕,价格一般只有正版的一半。我买的这款是三个接口兼容的,还包括韦东山和野火的接口。
硬件连接
下面是显示屏背面的连线:

下面是开发板背面的连线方式:

这款开发板的LCD连线有点特殊,刚开始我以为金手指在里面,而塑料面在外面,结果开发板不能点亮显示器,显示大量错误:
[E/drv.hwi2c] POWER_CTL reg I2C write failed
[I/touch] rt_touch init success
[I/gt9147] touch device gt9147 init success
[E/drv.hwi2c] POWER_CTL reg I2C write failed
id = GT-48-640
[E/drv.hwi2c] POWER_CTL reg I2C write failed
[E/drv.hwi2c] POWER_CTL reg I2C write failed
[E/drv.hwi2c] POWER_CTL reg I2C write failed
range_x = 1254749290
range_y = -1989128864
point_num = 88
把线调整过来之后,屏幕就可以正常点亮了。
软件测试
厂商提供了两个和RGB LCD有关的例子,我使用的是Titan_display_rgb_lvgl。
该项目是一个基于 Renesas RA8D1 微控制器的 RGB LCD 显示方案,使用以下技术栈:
- 操作系统:RT-Thread
- 图形库:LVGL
- 触摸芯片:GT9147
- 显示接口:RGB LCD
- 通信总线:I2C(用于触摸屏)
I2C 设备扫描工具的使用
在调试 I2C 设备时,首先需要确认设备是否正确连接到总线上。RT-Thread 提供了一个实用的 i2c_scan 命令。 i2c_scan 命令实现 在 hal_entry.c 中实现了 I2C 扫描功能。在 FinSH 控制台中输入:
bash
i2c_scan i2c0
正常情况下,如果 GT9147 触摸屏已连接,应该能看到:
bash
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 5d -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
其中 5d 就是 GT9147 触摸芯片的 I2C 地址。
LVGL示例
LVGL 测试程序会在系统启动时自动运行,其启动流程如下:
1. 自动初始化入口
cpp
// lv_rt_thread_port.c
INIT_ENV_EXPORT(lvgl_thread_init);
INIT_ENV_EXPORT 宏会在 RT-Thread 系统初始化时自动调用 lvgl_thread_init 函数。
2. LVGL 线程初始化
cpp
static int lvgl_thread_init(void)
{
rt_err_t err;
err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL,
&lvgl_thread_stack[0], sizeof(lvgl_thread_stack),
PKG_LVGL_THREAD_PRIO, 10);
if(err != RT_EOK)
{
LOG_E("Failed to create LVGL thread");
return -1;
}
rt_thread_startup(&lvgl_thread);
return 0;
}
3. LVGL 线程入口函数
cpp
static void lvgl_thread_entry(void *parameter)
{
lv_init(); // 初始化 LVGL 库
lv_tick_set_cb(&rt_tick_get_millisecond);
lv_port_disp_init(); // 初始化显示设备
lv_port_indev_init(); // 初始化输入设备(触摸屏)
lv_user_gui_init(); // 运行用户 GUI 程序(测试程序)
/* handle the tasks of LVGL */
while(1)
{
lv_timer_handler();
rt_thread_mdelay(PKG_LVGL_DISP_REFR_PERIOD);
}
}
4. 测试程序入口
cpp
void lv_user_gui_init(void)
{
/* display demo; you may replace with your LVGL application at here */
#if LV_USE_DEMO_MUSIC
lv_demos_create("music");
#elif LV_USE_DEMO_BENCHMARK
lv_demos_create("benchmark");
#elif LV_USE_DEMO_WIDGETS
lv_demos_create("widgets");
#elif LV_USE_DEMO_STRESS
lv_demos_create("stress");
#elif LV_USE_DEMO_RENDER
lv_demo_render(LV_DEMO_RENDER_SCENE_IMAGE_NORMAL, 128);
#else
#error "Please enable one lvgl demo in the env"
#endif
lv_demos_show_help();
}
测试结果
下图就是测试程序最后的跑分结果。

结束语
本文详细介绍了 RT-Thread LVGL RGB LCD 项目的测试和调试过程,包括: 设备扫描工具的使用、触摸屏 I2C 通信问题诊断和LVGL程序的自动启动机制。通过本文的介绍,希望能帮助开发者快速定位和解决类似的问题,提高开发效率。