[应用相关] 基于 TouchGFX 生成的代码中添加触摸功能的方法

[复制链接]
1032|19
 楼主| 豆杀包 发表于 2022-1-25 09:18 | 显示全部楼层 |阅读模式
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 所示。 6840361ef501cbe59c.png
图1. TouchGFX 生成的代码层次结构
TouchGFX 抽象层(Abstraction Layer,简称 AL) 具有一套特殊的职责, 职责要么在
AL (HAL)的硬件部分实现,要么在与 TouchGFX Engine 同步的 AL 部分实现,典型的做法
是通过 RTOS (OSAL)来实现。 图 2 总结了 TouchGFX AL 的主要职责,其中有一项任务就
是报告触摸与物理按钮事件, TouchGFX 将原始触摸动作转换为具体的触摸事件,并转发
给当前活动的
UI 元素。
4565361ef503be648e.png
图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 中的
配置界面,开发者需要根据触摸控制器驱动芯片进行正确配置。 881561ef507cec5a0.png
图3. I2C STM32CubeMX 配置界面  


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


 楼主| 豆杀包 发表于 2022-1-25 09:23 | 显示全部楼层
3.2. 在接口函数中添加实现代码
在渲染新的一帧之前, TouchGFX 引擎从 TouchController ButtonController 接口收
集外部输入。通过引擎将触摸控制器的坐标转换为点击、拖动和手势事件,并传递至应用
程序。 一些触摸控制器能够报告多个触摸点,
TouchGFX 不支持此功能,通常,只需选择
第一个触摸点。
8437561ef50f9370f7.png
图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 所
示。
9828061ef511003743.png
图5. sampleTouch()中轮询
基于中断: I2C 读取命令由定时器定期启动,或作为对触摸硬件外部中断的响应而启
动。 图 6 中 STM32TouchController.cpp 代码显示了 sampleTouch 如何在 RTOS 的系统中
实现。 当触摸事件产生时, I2C 会产生中断, 并将数据通过消息队列或全局变量提供给
STM32TouchController。
3744461ef511f10a58.png
图6. TouchGFX Generator 生成的 ToucGFXConfiguration.cpp


 楼主| 豆杀包 发表于 2022-1-25 09:27 | 显示全部楼层
4. 小结
本文介绍了 TouchGFX 从显示器的触摸控制器读取触摸坐标,并将其传递给应用程序
的方法及原理。 通过 STM32CubeMX 来初始化 I2C 外设,添加相应的驱动代码, 然后在
STM32TouchController.cpp 源文件中实现 init()和 sampleTouch()函数, 开发者就能够很容
易的为 TouchGFX 工程添加触摸功能。
drer 发表于 2022-2-7 13:47 | 显示全部楼层
这个软件的操作界面友好吗
coshi 发表于 2022-2-7 14:39 | 显示全部楼层
添加起来并不复杂啊
kxsi 发表于 2022-2-7 15:19 | 显示全部楼层
触摸屏如何校对呢
wiba 发表于 2022-2-7 15:34 | 显示全部楼层
具体代码还是需要自己添加
qcliu 发表于 2022-2-7 16:42 | 显示全部楼层
默认的是不支持触摸屏的吗
primojones 发表于 2022-2-20 14:05 | 显示全部楼层
想学一些简单的GUI,推荐什么书?
olivem55arlowe 发表于 2022-2-21 11:33 | 显示全部楼层
从未使用过TouchGFX的新手。
uiint 发表于 2022-2-21 15:49 | 显示全部楼层
使用非官方板可以吗
i1mcu 发表于 2022-2-21 17:50 | 显示全部楼层
touchgfx怎么添加stm32模板?
zerorobert 发表于 2022-2-21 18:50 | 显示全部楼层
TouchGFX支持Stm32F407系列吗?
jackcat 发表于 2022-2-21 19:26 | 显示全部楼层
TOUCHGFX快速入门
earlmax 发表于 2022-2-21 21:08 | 显示全部楼层
touchgfx stm32可以免费用吗
modesty3jonah 发表于 2022-2-21 21:35 | 显示全部楼层
来一份TouchGFX的资料
mickit 发表于 2022-2-21 22:04 | 显示全部楼层
TouchGFX让用户界面代码只占用10KB的 SRAM空间和20KB的闪存空间的C ++软件框架。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

323

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部