STM32F7 系列通过 LTDC(LCD-TFT 显示控制器)驱动 RGB 接口 LCD 时,TouchGFX 工程移植的核心是 “CubeMX 外设配置 + 外部存储驱动 + 链接文件调整”。本文基于 ST 官方 LAT1392 应用笔记,以 STM32F746G_DISCO 开发板为例,详解从 CubeMX 配置、驱动添加到 UI 生成的完整步骤,适配外部 SDRAM(帧缓冲)、QSPI Flash(素材存储)场景,新手也能快速点亮屏幕。
1. 核心前提与硬件基础
1.1 硬件环境
- 主控:STM32F746NGH6(Cortex-M7 内核);
- 存储:外部 SDRAM(帧缓冲 / 视频缓冲)、QSPI NOR Flash(图片 / 字体存储);
- LCD:RGB 接口(无内置 GRAM),触摸接口 I2C3(PH7/PH8);
- 核心外设:LTDC(显示控制)、DMA2D(图形加速)、FMC(SDRAM 控制)、QUADSPI(Flash 控制)。
1.2 工具清单
- 软件:STM32CubeMX 6.10.0、STM32CubeIDE 1.13.2、TouchGFX Designer 4.23.0;
- 参考文档:AN4861(LTDC 配置指南)、TouchGFX Board Setup(TBS)。
2. 第一步:STM32CubeMX 核心配置(关键基础)
按以下顺序完成配置,确保外设兼容 TouchGFX 引擎,避免后续性能问题:
2.1 工程创建与 MCU 选型
- 新建工程,搜索 “STM32F746NGH6”,勾选 “配置默认 MPU”(优化 Cortex-M7 推测性读取);
- 配置工程名称与路径,选择 STM32CubeIDE 作为目标 IDE。
2.2 核心外设配置(必选项)
(1)CORTEX-M7 内核配置
- 使能 ICACHE 和 DCACHE(提升图形处理性能);
- 配置 MPU:参考 AN4861 4.6 小节,优化内存访问属性,避免缓存冲突。
(2)CRC 使能(强制要求)
- TouchGFX 引擎依赖 CRC 校验单元,直接启用,保持默认配置即可。
(3)DMA2D 配置(图形加速)
(4)FMC 配置(SDRAM 控制)
- 用途:LTDC 帧缓冲、视频缓冲存于外部 SDRAM;
- 配置要点:对照 SDRAM datasheet 和原理图,设置时序参数,生成代码后需添加驱动(后续步骤);
- 关键注意:不使用 FMC bank1 时,需禁用(复位 MBKEN 位),避免 CPU 推测性读取干扰。
(5)LTDC 配置(显示核心)
- 基础参数:接口选择 “Parallel RGB”,启用全局中断和错误中断;
- Layer 配置:仅用 1 层(TouchGFX 默认单图层,节省带宽),参数如下:
- 窗口尺寸:水平 0-480、垂直 0-272(适配屏幕分辨率);
- 像素格式:RGB565;
- 帧缓冲地址:0xC0000000(SDRAM 起始地址);
- 混合因子:Alpha=255(不透明);
- 时钟配置:LTDC 时钟 = 9.6MHz(与屏幕刷新率匹配,参考屏幕时序表)。
(6)FreeRTOS 配置(可选,推荐)
- 启用 FreeRTOS,新增 2 个任务:
- TouchGFXTask:运行 TouchGFX 图形引擎;
- VideoTask:视频编解码(无需 Video 控件可删除);
- 注意:调整 “TOTAL HEAP SIZE”,避免任务栈空间不足。
(7)其他关键外设
- GPIO:配置 LCD_DISP(高电平启用显示)、LCD_BL_CTRL(高电平点亮背光)为输出;
- I2C3:启用触摸接口,保持默认时序(适配电容屏触摸 IC);
- QUADSPI:启用 QSPI Flash,配置为内存映射模式(素材存储用);
- SYS:时基选择 TIM6(SysTick 被 RTOS 占用);
- X-CUBE-TOUCHGFX:接口选 “Parallel RGB (LTDC)”,帧缓冲策略选 “Double Buffer”(无 GRAM 屏幕必选),应用滴答时钟来源选 “LTDC”。
2.3 时钟配置
- 系统时钟:216MHz(Cortex-M7 最大稳定频率);
- 外设时钟:LTDC 时钟 = 9.6MHz(通过时钟树分频得到,匹配屏幕要求)。
2.4 生成代码
配置完成后点击 “Generate Code”,CubeMX 会生成基础工程框架,后续需补充驱动与配置。
3. 第二步:添加关键驱动代码(外部存储适配)
仅用内部存储(Flash/RAM)可跳过此步,使用外部 SDRAM/QSPI Flash 需添加以下驱动:
3.1 SDRAM 驱动(FMC 配置)
在
MX_FMC_Init()函数的用户代码区添加驱动,核心是配置内存映射模式:// 禁用FMC bank1(未使用时)
FMC_Bank1->BTCR[0] = 0x000030D2;
// 补充SDRAM初始化时序代码(参考TBS,适配具体SDRAM型号)
- 作用:使 STM32 能正常访问 SDRAM,帧缓冲数据可写入 / 读取。
3.2 QSPI Flash 驱动
添加 QSPI 初始化代码,配置为 “memory mapped 模式”:
- 核心功能:让 TouchGFX 直接读取 QSPI 中的图片、字体素材,无需拷贝到 RAM。
3.3 触摸功能实现
在
STM32TouchController.cpp中添加 I2C3 触摸驱动:- 实现
init()(触摸 IC 初始化)、sample()(读取触摸坐标)函数,参考 TouchGFX TBS 模板。
4. 第三步:修改链接文件(存储分配)
需将不同数据分配到对应存储区域,不同 IDE 链接文件格式不同,以 STM32CubeIDE 为例(
STM32F746NGHX_FLASH.ld):- 帧缓冲 / 视频缓冲:分配到外部 SDRAM(地址 0xC0000000 起);
- 图片 / 字体素材:分配到 QSPI Flash(按实际 Flash 地址配置);
- 代码 / 全局变量:默认内部 Flash / 内部 RAM。
- 示例(SDRAM 分配):
.frame_buffer : { . = ALIGN(8); *(.frame_buffer) . = ALIGN(8); } >SDRAM AT>SDRAM - 其他 IDE:IAR(.icf 文件)、KEIL(.sct 文件)按对应语法调整,核心是 “地址与存储类型匹配”。
5. 第四步:TouchGFX UI 生成与代码整合
- 打开 TouchGFX Designer,导入工程中 “TouchGFX/ApplicationTemplate.touchgfx.part” 文件;
- 设计 UI 界面(如按钮、图片、文本),生成代码(菜单栏 “Generate Code”);
- 代码整合:生成的 UI 代码会自动加入工程,无需手动拷贝;
- 关键检查:
TouchGFXGeneratedHAL.cpp中HAL_LTDC_LineEventCallback函数是否正常实现(滴答时钟来源)。
6. 关键注意事项
- LTDC 图层选择:TouchGFX 默认单图层,双图层会占用更多带宽,不推荐;
- 帧缓冲策略:RGB 接口无 GRAM 屏幕,不可用 “Partial Buffer”,优先选 “Double Buffer”(避免画面撕裂);
- FMC bank1 禁用:未使用时必须复位 MBKEN 位,否则 Cortex-M7 推测性读取会导致性能问题;
- 时钟匹配:LTDC 时钟需与 LCD 刷新率一致,否则会出现花屏、闪屏;
- 堆空间充足:FreeRTOS 任务栈不足会导致 TouchGFXTask 启动失败,需合理配置 “TOTAL HEAP SIZE”。
STM32F7 LTDC RGB 接口 TouchGFX 移植的核心流程可概括为:
- CubeMX 配置:启用关键外设(LTDC/DMA2D/CRC/FMC 等),匹配硬件时序;
- 驱动补充:外部 SDRAM/QSPI/ 触摸驱动,确保存储可访问;
- 链接文件调整:数据分配到对应存储区域;
- UI 生成:TouchGFX Designer 设计并生成代码。
按此流程操作,即可完成从工程创建到屏幕点亮的全流程,适配大多数 RGB 接口 LCD 的 TouchGFX 开发需求。
阅读全文
774