
操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载本篇技术指南聚焦 RT-Thread 开源仓库中bsp/gd32/arm/gd32470z-lckfbBSP 的板级扩展模块 —— 立创·梁山派开发板配套 RGB LCD 屏幕驱动board/ports目录。该驱动由 LCKFB 开发、godmial 移植并重构为符合 RT-Thread 编码规范的代码覆盖了 GD32F470 的 TLI 显示控制器、SDRAM 帧缓冲、GPU(IPA) 外设、FT5206 电容触摸以及一个可直接运行的画板示例。读完本文你将掌握如何在 ENV 中一键开启该 LCD 驱动、理解其 TLI 时序与层配置、SDRAM 帧缓冲布局、触摸芯片的软件 I2C 通信原理并学会排查刷新抖动、触摸连点等常见问题。1. 驱动概述与文件构成在 board/ports 目录下本驱动由以下文件组成文件职责drv_lcd.cTLI 显示控制器初始化、显示时序/层配置以及点、线、矩形、圆、三角形、字符、图片等绘制 APIdrv_lcd.hLCD 分辨率、时序参数、帧缓冲地址、颜色宏定义与编译器兼容声明drv_touch.cFT5206 电容触摸芯片驱动软件 I2C 时序、寄存器读写、扫描与自测命令drv_touch.h触摸引脚宏、I2C 命令/寄存器地址、触摸点数据结构_m_tp_devdraw_panel.c画板示例实现清屏/选色/笔刷大小/橡皮擦四个按钮与触摸绘画交互font.hASCII 字符点阵字库16x8供字符串显示使用SConscript按宏开关将上述源文件按条件加入编译其中SConscript清晰地体现了各功能模块的编译依赖关系if GetDepend(BSP_USING_LCD): src [drv_lcd.c] if GetDepend(BSP_USING_TOUCH): src [drv_touch.c] if GetDepend(BSP_USING_DRAW_PANEL_EXAMPLE): src [draw_panel.c]也就是说drv_lcd.c是否参与编译取决于BSP_USING_LCD触摸与画板示例分别受BSP_USING_TOUCH与BSP_USING_DRAW_PANEL_EXAMPLE控制与下文 ENV 菜单一一对应。2. 在 ENV 中开启 LCD 驱动进入bsp/gd32/arm/gd32470z-lckfb目录在终端打开 ENV 工具并执行menuconfig按如下路径配置原文档建议全部开启Hardware Drivers Config --- Board extended module Drivers --- Enable LCD --- - [*]Enable TLI - [*]Enable SDRAM - [*]Enable TOUCH - [*]Enable GPU - [*]Enable DRAW PANEL EXAMPLE对应的 Kconfig 实现位于 board/Kconfig 的menu Board extended module Drivers段中各选项作用如下菜单项Kconfig 宏默认值作用Enable LCDBSP_USING_LCDn总开关同时select RT_USING_LCD不开启则本目录驱动完全不参与编译Enable TLIBSP_USING_TLIy开启 TLI 显示控制器初始化与绘制代码Enable SDRAMBSP_USING_SDRAMy开启外部 SDRAM帧缓冲存放地select RT_USING_SDRAMEnable TOUCHBSP_USING_TOUCHn开启 FT5206 触摸驱动select RT_USING_TOUCHEnable GPUBSP_USING_GPUy开启 IPA图像处理加速器时钟与中断使能select RT_USING_GPUEnable DRAW PANEL EXAMPLEBSP_USING_DRAW_PANEL_EXAMPLEn开启画板示例程序select RT_USING_DRAW_PANEL_EXAMPLE提示Enable LCD总开关下TLI、SDRAM、GPU 默认即开启触摸与画板示例默认关闭需要手动勾选。配置完成后保存退出在 BSP 根目录重新执行scons即可编译。3. 硬件平台与帧缓冲布局3.1 板级资源背景依据 gd32470z-lckfb/README.md梁山派开发板搭载GD32F470ZGT6ARM Cortex-M4主频最高 240MHz1024KB FLASH / 512KB RAM板载W9825G6KH-6I SDRAM与 RGB/MCU 双接口 TFT-LCD支持 RGB 屏幕直接点亮。SDRAM 的地址范围定义在 board/board.h 中#define EXT_SDRAM_BEGIN (0xC0000000U) /* the begining address of external SDRAM */ #define EXT_SDRAM_END (EXT_SDRAM_BEGIN (32U * 1024 * 1024)) /* 32MB 结束地址 */而 LCD 帧缓冲首地址在 drv_lcd.h 中定义为LCD_FRAME_BUF_ADDR 0xC0000000即 SDRAM 起始地址 —— 显存直接落在外部 SDRAM 中避免占用宝贵的片内 SRAM。3.2 显示规格与颜色定义驱动面向一块800x480的 RGB 接口屏幕像素格式为RGB565每像素 2 字节。drv_lcd.h中给出了完整的时序与帧缓冲参数#define LCD_WIDTH 800 #define LCD_HEIGHT 480 /* 水平同步 */ #define HORIZONTAL_SYNCHRONOUS_PULSE 10 #define HORIZONTAL_BACK_PORCH 150 #define ACTIVE_WIDTH 800 #define HORIZONTAL_FRONT_PORCH 15 /* 垂直同步 */ #define VERTICAL_SYNCHRONOUS_PULSE 10 #define VERTICAL_BACK_PORCH 140 #define ACTIVE_HEIGHT 480 #define VERTICAL_FRONT_PORCH 40 /* 帧缓冲地址 */ #define LCD_FRAME_BUF_ADDR 0xC0000000同时预定义了丰富的 RGB565 颜色宏WHITE、BLACK、BLUE、RED、GREEN、YELLOW、CYAN、MAGENTA、BROWN、GRAY以及 GUI 用的LIGHTBLUE、LGRAY、GRAYBLUE等可直接用于后续绘制 API。3.3 帧缓冲的编译器适配由于代码格式审查原因帧缓冲的声明针对不同编译器做了分支处理见drv_lcd.c与drv_lcd.h#if defined(__CC_ARM) || defined(__ARMCC_VERSION) /* Keil MDK Compiler将帧缓冲绝对定位到 SDRAM 地址 */ uint16_t ltdc_lcd_framebuf0[800][480] __attribute__((at(LCD_FRAME_BUF_ADDR))); #elif defined(__GNUC__) /* GCC (RT-Thread scons)仅为避免编译错误而定义的小占位数组 */ uint16_t ltdc_lcd_framebuf0[10][10]; #endif这是避免scons编译不通过的关键代码段Keil MDK 下通过__attribute__((at(...)))把 800x480 的帧缓冲精确安放到 SDRAM 起始地址而 GCCRT-Thread scons 默认工具链下由于链接脚本未预留 SDRAM 段直接声明大数组会导致链接失败因此仅定义一个[10][10]的占位数组保证编译通过实际帧缓冲地址在tli_config()中通过tli_layer_init_struct.layer_frame_bufaddr (uint32_t)ltdc_lcd_framebuf0;交由 TLI 控制器使用GCC 场景下实际显存位置需结合链接脚本确认这是移植者明确标注的取舍。4. 显示初始化流程TLI IPA 源码级解析入口函数为lcd_disp_config()声明于 drv_lcd.h实现在 drv_lcd.c它按以下顺序完成显示系统初始化lcd_disp_en_config() - 配置 DISP 使能引脚GPIOD PIN13推挽输出 lcd_disp_off() - 先拉低 DISP关屏 tli_gpio_config() - 配置 TLI 全部 RGB/同步信号引脚为 AF 复用模式 lcd_disp_on() - 拉高 DISP开屏/背光 tli_config() - 配置 PLLSAI 时钟、TLI 时序、Layer0 与帧缓冲 tli_layer_enable(LAYER0) - 使能 Layer0 tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN) - 帧消隐期重载配置 tli_enable() - 开启 TLI 控制器 ipa_config() - 使能 IPA 时钟并注册中断4.1 TLI 显示时序配置tli_config()中TLI 的像素时钟由 PLLSAI 分频产生if (ERROR rcu_pllsai_config(192, 2, 3)) /* 配置 PLLSAI 产生 TLI 时钟 */ while (1); rcu_tli_clock_div_config(RCU_PLLSAIR_DIV2); /* PLLSAIR 再二分频 */ rcu_osci_on(RCU_PLLSAI_CK); /* 开启 PLLSAI 时钟源 */ rcu_osci_stab_wait(RCU_PLLSAI_CK); /* 等待稳定 */随后填充tli_parameter_struct将drv_lcd.h中的同步脉冲、前后肩、有效区域宏换算为 TLI 寄存器要求的各段长度 - 1形式时序参数赋值说明synpsz_hpsz / vpszHORIZONTAL_SYNCHRONOUS_PULSE - 110-1HSYNC/VSYNC 同步脉冲宽度backpsz_hbpsz / vbpsz同步脉冲 后肩 - 1水平/垂直后肩activesz_hasz / vasz同步脉冲 后肩 有效宽度 - 1有效显示区终点totalsz_htsz / vtsz同步脉冲 后肩 有效 前肩 - 1整行/整帧总长信号极性配置为TLI_HSYN_ACTLIVE_LOW、TLI_VSYN_ACTLIVE_LOW、TLI_DE_ACTLIVE_LOW、TLI_PIXEL_CLOCK_TLI背景色设为白色R/G/B 均为 0xFF。4.2 Layer0 层配置与帧缓冲屏幕内容通过 Layer0 输出关键配置如下layer_window_leftpos HORIZONTAL_SYNCHRONOUS_PULSE HORIZONTAL_BACK_PORCH; /* 窗口左边界 */ layer_window_rightpos ACTIVE_WIDTH HORIZONTAL_SYNCHRONOUS_PULSE HORIZONTAL_BACK_PORCH - 1; layer_ppf LAYER_PPF_RGB565; /* 像素格式 RGB565 */ layer_sa 255; /* 指定 alpha 全不透明 */ layer_acf1 / layer_acf2 LAYER_ACF1_SA / LAYER_ACF2_SA; /* 混合因子使用 alpha */ layer_frame_bufaddr (uint32_t)ltdc_lcd_framebuf0; /* 帧缓冲基地址 */ layer_frame_line_length (ACTIVE_WIDTH * 2) 3; /* 每行字节数含对齐 */ layer_frame_buf_stride_offset ACTIVE_WIDTH * 2; /* 行跨度 1600 字节 */ layer_frame_total_line_number ACTIVE_HEIGHT; /* 总行数 480 */最后调用tli_dither_config(TLI_DITHER_ENABLE)开启抖动dithering以改善低位数色彩时的显示质量。4.3 GPIO 与 IPAtli_gpio_config()使能 GPIOA/B/C/D/F/G 时钟将 HSYNC(PC6)、VSYNC(PA4)、PCLK(PG7)、DE(PF10) 以及 RGB 数据线R7 在 PG6、R3 在 PB0、G7 在 PD3、G2 在 PA6、B7 在 PB9、B4 在 PG12 等 15 位色深线逐一gpio_af_set为 AF14/AF9 复用并配置为推挽、50MHz 输出。注意其中 R3 使用 AF9其余大多数使用 AF14。ipa_config()rcu_periph_clock_enable(RCU_IPA)打开 IPA 外设时钟nvic_irq_enable(IPA_IRQn, 0, 2)使能其中断。IPA 即 GD32F4 的图形加速单元GPU后续可在绘制中大显身手。5. 软件绘制 API 一览drv_lcd.c提供了一套直接操作帧缓冲的软件绘制函数全部基于最底层的tli_draw_point()向ltdc_lcd_framebuf0[0] LCD_WIDTH * y x写入 RGB565 颜色值函数功能算法/说明tli_draw_point(x, y, color)单点绘制直接写帧缓冲tli_draw_line(...)直线Bresenham 画线算法tli_draw_rectangle(...)矩形可填充fill1 填充否则四条边线tli_draw_circle(xc, yc, c, r, fill)圆/圆盘中点圆算法fill 时逐行填充tli_draw_triangle(...)三角形可填充扫描线光栅化内部用_swap排序顶点tli_point_enlarge(x, y, color, magnify)放大点用 4 个矩形画十字块即笔刷tli_show_char(...)单个 ASCII 字符基于asc2_160816x8 点阵支持放大与叠加tli_show_string(...)字符串逐字符绘制并自动处理边界仅 ~~ 可见字符tli_show_picture(x, y, w, h, pic)图片输入 RGB565 双字节数组tli_show_button(...)圆角按钮四角画圆 四条边线 矩形填充组合tli_show_switch(...)开关控件圆角底座 圆形滑块根据 sw 切换 on/off 颜色注意由于代码格式审查原因本驱动未包含中文显示函数但可直接移植官方源码中的中文显示函数字库与tli_show_char兼容使用。6. 触摸驱动FT5206 软件 I2C 全解析6.1 引脚与寄存器触摸部分基于FT5206 电容触摸芯片通过 GPIO 软件模拟 I2C 与芯片通信。引脚定义见 drv_touch.h信号引脚说明SCLPB6时钟上拉推挽输出SDAPB7数据输入/输出切换上拉RSTPD12复位引脚INTPD11触摸中断输入关键 I2C 命令与寄存器定义#define FT_CMD_WR 0x70 /* 写命令 */ #define FT_CMD_RD 0x71 /* 读命令 */ #define FT_DEVIDE_MODE 0x00 /* 模式控制 */ #define FT_REG_NUM_FINGER 0x02 /* 触摸点数状态 */ #define FT_TP1_REG ... FT_TP5_REG /* 0x03/0x09/0x0F/0x15/0x1B 五个触摸点数据 */ #define FT_ID_G_LIB_VERSION 0xA1 /* 固件版本 */ #define FT_ID_G_MODE 0xA4 /* 中断模式 */ #define FT_ID_G_THGROUP 0x80 /* 触摸灵敏度阈值 */ #define FT_ID_G_PERIODACTIVE 0x88 /* 采样激活周期 */ #define TP_PRES_DOWN 0x80 /* 按下标志 */ #define TP_CATH_PRES 0x40 /* 触点按下标志 */ #define CT_MAX_TOUCH 5 /* 最多 5 点触摸 */6.2 软件 I2C 时序drv_touch.c用 GPIO 位操作完整实现了标准 I2C 时序CT_IIC_Start/Stop起始/停止条件、CT_IIC_Send_Byte/Read_Byte字节收发、CT_IIC_Wait_Ack/Ack/NAck应答管理并通过delay_us基于 SysTick 轮询的微秒延时与CT_Delay控制 I2C 速率。其中每字节高位先行MSB first等待 ACK 以 250 次为超时上限超时自动产生 Stop 条件返回失败读字节时最后一字节发 NACK 表示读结束。6.3 初始化与扫描FT5206_Init()完成配置 INT 引脚为输入 →CT_IIC_Init()初始化 I2C 引脚 → 写入设备模式、中断模式、灵敏度阈值22、激活周期12→ 读取并打印芯片固件版本CTP ID:xxxx。FT5206_Scan(mode)采用轮询方式每 10 次调用读取一次FT_REG_NUM_FINGER若检测到 1~5 个触点g_gt_tnum 5则依次读取FT_TPx_REG的 4 字节原始坐标根据tp_dev.touchtype交换 X/Y 得到像素坐标写入全局触摸结构体tp_dev。还包含越界保护坐标超过 800/480 时回退到上一有效点与松手判定无触点时清除按下标志。相关数据结构typedef struct { uint16_t x[CT_MAX_TOUCH]; /* 触点 X 坐标 */ uint16_t y[CT_MAX_TOUCH]; /* 触点 Y 坐标 */ uint8_t sta; /* 触摸状态标志 */ float xfac, yfac; /* 坐标缩放系数预留校准用 */ short xoff, yoff; /* 坐标偏移 */ uint8_t touchtype; /* 触摸类型坐标交换标志 */ } _m_tp_dev;该结构体全局实例为tp_dev应用层通过tp_dev.x[0] / tp_dev.y[0]读取主触点坐标。此外还提供letgo_scan(contact, sx, sy, ex, ey)阻塞等待手指离开指定矩形区域用于按钮的按下-抬起语义。6.4 触摸自测命令touch_test通过MSH_CMD_EXPORT注册为 MSH shell 命令。在 FinSH 终端输入touch_test即可进入循环测试FT5206_Scan检测到触摸时打印touch。该函数内部为while(1)死循环仅用于手动验证触摸功能测试完成后需复位开发板退出。7. 画板示例触摸 绘制的完整应用draw_panel.c演示了如何把上述显示与触摸能力组合成一个可交互应用。draw_panel_test通过INIT_COMPONENT_EXPORT在系统组件初始化阶段自动运行无需在 MSH 手动执行界面布局800x480 屏幕底部一排按钮圆角半径 12按钮位置 (x, y, w, h)功能color(10, 400, 120, 70)循环切换 14 种颜色color_buf[]pixel(340, 400, 120, 70)笔刷放大倍数 1~20PIXEL_SIZE_MAX数字实时显示eraser(540, 400, 120, 70)切换橡皮擦模式黑底/蓝底区分状态clear(670, 400, 120, 70)清屏为白色交互流程lcd_disp_config(); /* 初始化显示 */ FT5206_Init(); /* 初始化触摸 */ tli_draw_rectangle(0, 0, 800, 480, WHITE, 1); /* 白底清屏 */ ui_init(); /* 绘制四个按钮 */ while (1) { touch_state FT5206_Scan(0); /* 轮询触摸 */ if (touch_state 1) { /* 命中按钮区域则执行对应操作letgo_scan 等待松手 */ /* 否则用 tli_point_enlarge 以当前颜色笔刷大小落笔 橡皮擦模式下以 WHITE 覆盖实现擦除 */ } }主循环中的绘制核心是tli_point_enlarge(tp_dev.x[0], tp_dev.y[0], color_buf[color_num], button_pixel.value)—— 手指在画布上滑动时以放大笔刷实时写帧缓冲即可实现绘画效果。这一示例既是 LCD触摸驱动的自检工具也可作为自定义 UI 的基础框架。8. 注意事项与常见问题排查屏幕刷新抖动、触摸连点原文档指出可尝试将 system_gd32f4xx.c 中的系统时钟值修改为#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL (uint32_t)(240000000)使系统主频稳定在 240MHz梁山派 GD32F470ZGT6 最高主频即 240MHz随后重新编译。时序不稳会直接影响 TLI 刷新与 FT5206 采样这是排查该类现象的首选手段。中文显示由于代码格式审查原因本驱动未包含中文显示函数。可直接移植官方源码中的中文显示函数配合本驱动的 ASCII 点阵框架使用。编译器兼容为避免scons编译不通过帧缓冲采用__CC_ARM/__ARMCC_VERSIONKeil与__GNUC__RT-Thread scons分支声明详见第 3.3 节。修改该段时务必保持两个分支同时更新。触摸自测touch_test为死循环仅供调试draw_panel_test由系统组件初始化自动启动若不需要画板功能在 ENV 中关闭Enable DRAW PANEL EXAMPLE即可。触摸开关BSP_USING_TOUCH默认关闭需要触摸功能时请务必在 ENV 中手动勾选否则FT5206_Init、tp_dev等相关符号不可用。9. 进一步阅读BSP 整体说明与硬件资源表gd32470z-lckfb/README.md菜单配置实现board/Kconfig板级地址定义SDRAM 基址board/board.hLCD 驱动源码drv_lcd.c / drv_lcd.h触摸驱动源码drv_touch.c / drv_touch.h画板示例draw_panel.c编译依赖控制SConscript赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐RT-Thread 下 GD32F470 立创开发板 RGB LCD 触摸驱动实践TLI 显示、SDRAM 帧缓冲与 FT5206 电容触摸全解析RT Thread 下 GD32F470 立创开发板 RGB LCD 触摸驱动实践TLI 显示、SDRAM 帧缓冲与 FT5206 电容触摸全解析 导读 本指操作系统嵌入式物联网嵌入式OSRTOSRT-Thread GD32470Z-LCKFB 梁山派 BSP 开发指南从快速上手到 RGB LCD 触摸屏扩展RT Thread GD32470Z LCKFB 梁山派 BSP 开发指南从快速上手到 RGB LCD 触摸屏扩展 本指南以 RT Thread 仓库中的 g操作系统嵌入式物联网嵌入式OSRTOSMicroPython pyboard LCD 触摸屏扩展板LCD Touch-Sensor Skin实战指南焊接、显示驱动与 MPR121 触摸读取MicroPython pyboard LCD 触摸屏扩展板LCD Touch Sensor Skin实战指南焊接、显示驱动与 MPR121 触摸读取 导嵌入式语言运行时编程语言解释器编译器物联网系统编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考