你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于 TouchGFX 生成的代码中添加触摸功能的方法

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

' M& o- i. }- w1 x* f/ k$ s! i6 E7 J
2.TouchGFX 抽象层架构
TouchGFX 引擎通过 实例化了的HAL子类来访问 HAL。这些子类由 TouchGFX Generator生成,Generator 是创建抽象层的主要工具,可以生成反映 STM32CubeMX 配置的 HAL 部分,以及 CMSIS V1 或 V2 的 OSAL。通常 HAL 的架构如下图 1 所示。

( L- |% l. G+ y- d- K/ D) b
640 (5).png
8 B! Q; J% v; {' z# z$ ^5 {

: r2 v/ w5 G, m9 ~
TouchGFX 抽象层(Abstraction Layer,简称 AL)具有一套特殊的职责, 职责要么在AL (HAL)的硬件部分实现,要么在与 TouchGFX Engine 同步的 AL 部分实现,典型的做法是通过 RTOS (OSAL)来实现。图 2 总结了 TouchGFX AL 的主要职责,其中有一项任务就是报告触摸与物理按钮事件,TouchGFX 将原始触摸动作转换为具体的触摸事件,并转发给当前活动的 UI 元素。

; y. O6 O3 M+ i9 R+ O" A, n) x
640 (4).png

$ I. ]( w" K0 e5 G7 Q" \* d+ F  w: v7 w- v5 ^& D
3.触摸功能实现步骤
要实现触摸功能,首先需通过 STM32CubeMX 正确配置触摸控制器和 MCU,并添加相应驱动代码,保证 MCU 通过 I2C 或其他接口从触摸控制器读取信息,最后在TouchController 接口函数中添加相应的实现代码。

5 M8 X6 q4 B% L. J! n: z
3.1. STM32CubeMX 配置
2 e! u  K7 l# _' w
为了实现与触摸控制器的通讯,大多数触摸控制器都会连接至 I2C 总线,因此需要在STM32CubeMX 中对 I2C 外设进行设置。许多 STM32 MCU 具有多个 I2C 外设,因此需选择正确的 I2C 进行配置,此外还需配置相关 GPIO,图 3 是 I2C 在 STM32CubeMX 中的配置界面,开发者需要根据触摸控制器驱动芯片进行正确配置。

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

. Q- a: J% X& c. f: S% w
3.2. 在接口函数中添加实现代码
0 a- N3 }* n& Z7 H9 v
在渲染新的一帧之前,TouchGFX 引擎从 TouchController 和 ButtonController 接口收集外部输入。通过引擎将触摸控制器的坐标转换为点击、拖动和手势事件,并传递至应用程序。一些触摸控制器能够报告多个触摸点,TouchGFX 不支持此功能,通常,只需选择第一个触摸点。
, C) _, G+ G) O2 G
640 (2).png

+ @) k) h) R+ c3 T9 W0 R* i" C4 Z, H9 H! [# P4 S% b3 s# t
TouchGFX 引擎在收集输入时,引擎会调用 tc 对象的 sampleTouch()函数。TouchGFX Generator 会生成一个 TouchController 类,并将接口函数定义为空。在STM32TouchController.hpp 中会声明了 init()和 sampleTouch()两个成员函数,开发者需要做的就是在 STM32TouchController.cpp 源文件中添加相应的实现代码,在 init()函数中添加触摸控制器的初始化代码,在 sampleTouch()函数中添加相应实现代码,将读取的触摸坐标值分配给 x 和 y,并返回是否检测到触摸。
1 M, P& a2 |9 {) h2 `2 I, }) V
其中有多种实现 sampleTouch()函数的方法:一种是在 sampleTouch()中轮询,另一种是基于中断实现。在 sampleTouch() 中轮询:通过发送请求并轮询结果,从硬件触摸控制器(通常为 I2C) 读取触摸状态和触摸坐标,默认情况下,该函数每个 tick 时间被调用一次, 如下图 5 所示。
0 \' W8 }( d# Q7 A# j2 ?; t
640 (1).png
  f1 H& N* K, H+ @2 U1 x
基于中断:I2C 读取命令由定时器定期启动,或作为对触摸硬件外部中断的响应而启动。图 6 中 STM32TouchController.cpp 代码显示了 sampleTouch 如何在 RTOS 的系统中实现。当触摸事件产生时,I2C 会产生中断,并将数据通过消息队列或全局变量提供给STM32TouchController。
640.png
! r; x. s, R2 ^1 `3 O' X! C3 ^& R
6 a% T6 ^0 c. x* o9 h+ Y2 Y
/ q3 T  U  s0 Z9 a6 O
小结
本文介绍了 TouchGFX 从显示器的触摸控制器读取触摸坐标,并将其传递给应用程序的方法及原理。通过 STM32CubeMX 来初始化 I2C 外设,添加相应的驱动代码,然后在STM32TouchController.cpp 源文件中实现 init()和 sampleTouch()函数,开发者就能够很容易的为 TouchGFX 工程添加触摸功能。
# a9 i2 V( ?2 @/ a1 J; d+ F: h4 F/ t
收藏 评论0 发布时间:2022-5-12 11:32

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版