打印
[应用相关]

基于 TouchGFX 生成的代码中添加触摸功能的方法

[复制链接]
626|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1. 引言
越来越多的智能设备会在 MCU 上实现图形界面,而 TouchGFX 是专门用于 ST MCU
上的图形界面设计软件,使图形界面在 MCU 上能达到类似智能手机的显示效果。
TouchGFX 图形引擎包括三部分:搜集、更新、渲染。 其中在搜集阶段, 图形引擎从外部
环境收集事件, 这些事件通常是触摸和按钮事件。
TouchGFX 采样并将事件传递到应用程
序, 这样原始触摸动作
就被转换为更具体的应用程序的触摸事件。例如, 点击(用户在显
示屏上按下或松开手指) 、拖动(用户触摸显示屏并在显示屏上移动手指) 、手势(用户
向一个方向快速移动手指,然后松开) 等功能,这些操作都会被图形引擎识别并转发给当
前活动的
UI 元素。
本文主要介绍
TouchGFX 从显示器的触摸控制器读取触摸坐标,并将其传递给应用程
序的方法及原理,使开发者能够很容易的在
TouchGFX 生成的代码中添加触摸功能。  

使用特权

评论回复
沙发
豆杀包|  楼主 | 2022-1-25 09:19 | 只看该作者
2. TouchGFX 抽象层架构
TouchGFX 引擎通过 HAL 的具体子类来访问 HAL。这些子类由 TouchGFX Generator
生成, Generator 是创建抽象层的主要工具,可以生成反映 STM32CubeMX 配置的 HAL
部分,以及 CMSIS V1 或 V2 的 OSAL。 通常 HAL 的架构如图 1 所示。
图1. TouchGFX 生成的代码层次结构
TouchGFX 抽象层(Abstraction Layer,简称 AL) 具有一套特殊的职责, 职责要么在
AL (HAL)的硬件部分实现,要么在与 TouchGFX Engine 同步的 AL 部分实现,典型的做法
是通过 RTOS (OSAL)来实现。 图 2 总结了 TouchGFX AL 的主要职责,其中有一项任务就
是报告触摸与物理按钮事件, TouchGFX 将原始触摸动作转换为具体的触摸事件,并转发
给当前活动的
UI 元素。

图2. TouchGFX AL 主要职责



使用特权

评论回复
板凳
豆杀包|  楼主 | 2022-1-25 09:20 | 只看该作者
3. 触摸功能实现步骤
要实现触摸功能, 首先需通过 STM32CubeMX 正确配置触摸控制器和 MCU, 并添加相
应驱动代码, 保证 MCU 通过 I2C 或其他接口从触摸控制器读取信息,最后在
TouchController 接口函数中添加相应的实现代码。

使用特权

评论回复
地板
豆杀包|  楼主 | 2022-1-25 09:22 | 只看该作者
3.1. STM32CubeMX 配置
了实现与触摸控制器的通讯, 大多数触摸控制器都会连接至 I2C 总线, 因此需要在
STM32CubeMX 中对 I2C 外设进行设置。 许多 STM32 MCU 具有多个 I2C 外设,因此需选
择正确的
I2C 进行配置,此外还需配置相关 GPIO,图 3 是 I2C 在 STM32CubeMX 中的
配置界面,开发者需要根据触摸控制器驱动芯片进行正确配置。
图3. I2C STM32CubeMX 配置界面  


配置好 I2C 后,还需添加 I2C 的驱动代码,如果没有用于触摸控制器的驱动代码,则
需要从头开始编写。 STM32Cube 固件库中提供了一些 I2C 通讯的驱动程序,开发者可以
从中参考相关代码进行修改使用。根据触摸控制器的数据手册, 为确保通过读取寄存器可
以获取触摸坐标, 首先要检查的是触摸控制器的 I2C 地址,然后读取“设备 ID”寄存器,
以进行测试,然后测试是否可以从触摸控制器接收到正确的 x 值和 y 值。


使用特权

评论回复
5
豆杀包|  楼主 | 2022-1-25 09:23 | 只看该作者
3.2. 在接口函数中添加实现代码
在渲染新的一帧之前, TouchGFX 引擎从 TouchController ButtonController 接口收
集外部输入。通过引擎将触摸控制器的坐标转换为点击、拖动和手势事件,并传递至应用
程序。 一些触摸控制器能够报告多个触摸点,
TouchGFX 不支持此功能,通常,只需选择
第一个触摸点。

图4. TouchGFX Generator 生成的 ToucGFXConfiguration.cpp  


TouchGFX 引擎在收集输入时,引擎会调用 tc 对象的 sampleTouch()函数。 TouchGFX
Generator 会生成一个 TouchController 类,并将接口函数定义为空。 在
STM32TouchController.hpp 中会声明了 init()和 sampleTouch()两个成员函数, 开发者需要
做的就是在 STM32TouchController.cpp 源文件中添加相应的实现代码,在 init()函数中添
加触摸控制器的初始化代码,在 sampleTouch()函数中添加相应实现代码, 将读取的触摸
坐标值分配给 x 和 y,并返回是否检测到触摸。 其中有多种实现 sampleTouch()函数的方
法: 一种是在 sampleTouch()中轮询,另一种是基于中断实现。
在 sampleTouch() 中轮询:通过发送请求并轮询结果, 从硬件触摸控制器(通常为 I2C)
读取触摸状态和触摸坐标, 默认情况下,该函数每个 tick 时间被调用一次, 如下图 5 所
示。

图5. sampleTouch()中轮询
基于中断: I2C 读取命令由定时器定期启动,或作为对触摸硬件外部中断的响应而启
动。 图 6 中 STM32TouchController.cpp 代码显示了 sampleTouch 如何在 RTOS 的系统中
实现。 当触摸事件产生时, I2C 会产生中断, 并将数据通过消息队列或全局变量提供给
STM32TouchController。

图6. TouchGFX Generator 生成的 ToucGFXConfiguration.cpp


使用特权

评论回复
6
豆杀包|  楼主 | 2022-1-25 09:27 | 只看该作者
4. 小结
本文介绍了 TouchGFX 从显示器的触摸控制器读取触摸坐标,并将其传递给应用程序
的方法及原理。 通过 STM32CubeMX 来初始化 I2C 外设,添加相应的驱动代码, 然后在
STM32TouchController.cpp 源文件中实现 init()和 sampleTouch()函数, 开发者就能够很容
易的为 TouchGFX 工程添加触摸功能。

使用特权

评论回复
7
drer| | 2022-2-7 13:47 | 只看该作者
这个软件的操作界面友好吗

使用特权

评论回复
8
coshi| | 2022-2-7 14:39 | 只看该作者
添加起来并不复杂啊

使用特权

评论回复
9
kxsi| | 2022-2-7 15:19 | 只看该作者
触摸屏如何校对呢

使用特权

评论回复
10
wiba| | 2022-2-7 15:34 | 只看该作者
具体代码还是需要自己添加

使用特权

评论回复
11
qcliu| | 2022-2-7 16:42 | 只看该作者
默认的是不支持触摸屏的吗

使用特权

评论回复
12
primojones| | 2022-2-20 14:05 | 只看该作者
想学一些简单的GUI,推荐什么书?

使用特权

评论回复
13
olivem55arlowe| | 2022-2-21 11:33 | 只看该作者
从未使用过TouchGFX的新手。

使用特权

评论回复
14
uiint| | 2022-2-21 15:49 | 只看该作者
使用非官方板可以吗

使用特权

评论回复
15
i1mcu| | 2022-2-21 17:50 | 只看该作者
touchgfx怎么添加stm32模板?

使用特权

评论回复
16
zerorobert| | 2022-2-21 18:50 | 只看该作者
TouchGFX支持Stm32F407系列吗?

使用特权

评论回复
17
jackcat| | 2022-2-21 19:26 | 只看该作者
TOUCHGFX快速入门

使用特权

评论回复
18
earlmax| | 2022-2-21 21:08 | 只看该作者
touchgfx stm32可以免费用吗

使用特权

评论回复
19
modesty3jonah| | 2022-2-21 21:35 | 只看该作者
来一份TouchGFX的资料

使用特权

评论回复
20
mickit| | 2022-2-21 22:04 | 只看该作者
TouchGFX让用户界面代码只占用10KB的 SRAM空间和20KB的闪存空间的C ++软件框架。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

323

帖子

0

粉丝