0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_pJlTbmA9 来源:STM32单片机 作者:STM32单片机 2023-10-27 09:21 次阅读

1.引言

越来越多的智能设备会在 MCU 上实现图形界面,而 TouchGFX 是专门用于 ST MCU上的图形界面设计软件,使图形界面在 MCU 上能达到类似智能手机的显示效果。TouchGFX 图形引擎包括三部分:搜集、更新、渲染。其中在搜集阶段,图形引擎从外部环境收集事件,这些事件通常是触摸和按钮事件。TouchGFX 采样并将事件传递到应用程序,这样原始触摸动作就被转换为更具体的应用程序的触摸事件。例如,点击(用户在显示屏上按下或松开手指)、拖动(用户触摸显示屏并在显示屏上移动手指)、手势(用户向一个方向快速移动手指,然后松开)等功能,这些操作都会被图形引擎识别并转发给当前活动的 UI 元素。

本文主要介绍 TouchGFX 从显示器的触摸控制器读取触摸坐标,并将其传递给应用程序的方法及原理,使开发者能够很容易的在 TouchGFX 生成的代码中添加触摸功能。

2.TouchGFX 抽象层架构

TouchGFX 引擎通过 实例化了的HAL子类来访问 HAL。这些子类由 TouchGFX Generator生成,Generator 是创建抽象层的主要工具,可以生成反映 STM32CubeMX 配置的 HAL 部分,以及 CMSIS V1 或 V2 的 OSAL。通常 HAL 的架构如下图 1 所示。

wKgZomUD6OWAORsAAACq3MT8RD8126.png

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

wKgZomUD6OeAR704AAC8MW6X664199.png

3.触摸功能实现步骤

要实现触摸功能,首先需通过 STM32CubeMX 正确配置触摸控制器和 MCU,并添加相应驱动代码,保证 MCU 通过 I2C 或其他接口从触摸控制器读取信息,最后在TouchController 接口函数中添加相应的实现代码。

3.1. STM32CubeMX 配置

为了实现与触摸控制器的通讯,大多数触摸控制器都会连接至 I2C 总线,因此需要在STM32CubeMX 中对 I2C 外设进行设置。许多 STM32 MCU 具有多个 I2C 外设,因此需选择正确的 I2C 进行配置,此外还需配置相关 GPIO,图 3 是 I2C 在 STM32CubeMX 中的配置界面,开发者需要根据触摸控制器驱动芯片进行正确配置。

wKgaomUD6OiAGHs9AAJRQc81jLg317.png

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

3.2. 在接口函数中添加实现代码

在渲染新的一帧之前,TouchGFX 引擎从 TouchController 和 ButtonController 接口收集外部输入。通过引擎将触摸控制器的坐标转换为点击、拖动和手势事件,并传递至应用程序。一些触摸控制器能够报告多个触摸点,TouchGFX 不支持此功能,通常,只需选择第一个触摸点。

wKgaomUD6OmALemNAAC0MHB7G6A772.png

TouchGFX 引擎在收集输入时,引擎会调用 tc 对象的 sampleTouch()函数。TouchGFX Generator 会生成一个 TouchController 类,并将接口函数定义为空。在STM32TouchController.hpp 中会声明了 init()和 sampleTouch()两个成员函数,开发者需要做的就是在 STM32TouchController.cpp 源文件中添加相应的实现代码,在 init()函数中添加触摸控制器的初始化代码,在 sampleTouch()函数中添加相应实现代码,将读取的触摸坐标值分配给 x 和 y,并返回是否检测到触摸。

其中有多种实现 sampleTouch()函数的方法:一种是在 sampleTouch()中轮询,另一种是基于中断实现。在 sampleTouch() 中轮询:通过发送请求并轮询结果,从硬件触摸控制器(通常为 I2C) 读取触摸状态和触摸坐标,默认情况下,该函数每个 tick 时间被调用一次, 如下图 5 所示。

wKgZomUD6OuAKgbpAAF5WywBfOA014.png

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

wKgaomUD6O2AdWKHAAC9HngkZlg616.png

小结

本文介绍了 TouchGFX 从显示器的触摸控制器读取触摸坐标,并将其传递给应用程序的方法及原理。通过 STM32CubeMX 来初始化 I2C 外设,添加相应的驱动代码,然后在STM32TouchController.cpp 源文件中实现 init()和 sampleTouch()函数,开发者就能够很容易的为 TouchGFX 工程添加触摸功能。

来源:STM32单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TouchGFX
    +关注

    关注

    1

    文章

    40

    浏览量

    13052
  • HAL
    HAL
    +关注

    关注

    2

    文章

    68

    浏览量

    12472
收藏 人收藏

    评论

    相关推荐

    TouchGFX实现触摸功能方法及原理

    包括三部分:搜集、更新、渲染。其中在搜集阶段,图形引擎从外部环境收集事件,这些事件通常是触摸和按钮事件。TouchGFX 采样并将事件传递到应用程序,这样原始触摸动作就被转换为更具体的应用程序的
    的头像 发表于 05-12 13:14 8460次阅读

    如何添加触摸屏驱动到TouchGFX中?

    使用STM32CubeMX移植TouchGFX 一文中介绍了如何用TouchGFX点亮屏幕,但是此时屏幕还没有触摸功能。下面将介绍如何添加
    的头像 发表于 10-09 14:41 1067次阅读

    TouchGFX开发(2)----触摸屏幕组件点亮LED

    了解如何使用 TouchGFX 配置屏幕,添加触摸按钮,并通过按钮控制板载 LED 的状态。
    的头像 发表于 11-09 15:25 480次阅读
    <b class='flag-5'>TouchGFX</b>开发(2)----<b class='flag-5'>触摸</b>屏幕组件点亮LED

    STM32F429I-DISC1的触摸屏为什么无法使用TOUCHgfx生成代码正常工作?

    简单的按钮按下项目,但是,在 STM32CUBEIDE 调试并加载此代码后,无法在此触摸屏上检测到按下。我做了很多尝试,包括将演示固件加载回我的电路板,以检查是否由于电路板损坏而出现问题,但是当我通过
    发表于 12-02 06:27

    TouchGFX为什么无法添加链接?

    我正在尝试运行 TouchGFX 教程的教程 2(因为我是新成员,我无法添加链接,但它是 TouchGFX 版本 4 19 教程指南,教程 2)我已经成功运行到“第 4 步:
    发表于 12-07 06:45

    TouchGFX没有生成新屏幕的转换声明代码是何原因

    ::gotoMainScreenNoTransition() )但是当我尝试再添加一个屏幕时,TouchGFX 没有生成屏幕新屏幕的转换声明代码,但它确实在 FrontendAppli
    发表于 12-21 06:42

    将图形点击触发器添加到图形和生成代码中出错如何解决呢?

    我将“图形点击触发器”添加到图形和生成代码。在 MainView Base.cpp graph.setClick Action(graphClickCallback)
    发表于 01-06 06:42

    如何在不使用CubeMX的情况下将touchgfx项目文件添加到keil?

    Designer 生成的新文件。例如,当我在 TouchGFX Designer 添加新屏幕并生成
    发表于 01-29 07:54

    在STM32CubeIDE上构建TouchGFX生成代码,报调试器错误怎么处理?

    我正在努力在 STM32Cube IDE 上构建 TouchGFX 生成代码。我正在处理以下设置:软件工具链:STM32CubeMX 5.6.0TouchGFX 4.13.0 设计器
    发表于 02-07 07:11

    如何在代码touchgfx-open-repository添加二维码小部件?

    我想动态生成二维码,也想在运行时有时清除它。我得到了 github 链接并在我的项目中添加了这些文件。我仍然不确定如何称呼它。您提到调用 qrCode.setXY(0,0
    发表于 02-08 07:44

    TouchGFXCallback模板实现原理

    interaction 给按键添加响应;或者创建多个界面,在界面间进行切换;这些功能由 designer 帮我们自动生成代码实现了,那与
    发表于 09-11 06:16

    LPC4353 TouchGFX

    LPC4353 TouchGFX触摸代码
    发表于 03-17 08:18 15次下载

    TouchGFX代码框架以及如何添加用户代码

    1. 摘要 本文档主要介绍,TouchGFX代码框架以及如何添加用户代码。 2. 准备工作 可以正常运行的TouchGFX工程 3.
    的头像 发表于 01-18 11:28 2327次阅读
    <b class='flag-5'>TouchGFX</b><b class='flag-5'>代码</b>框架以及如何<b class='flag-5'>添加</b>用户<b class='flag-5'>代码</b>

    如何在TouchGFX框架下实现校准电阻触摸屏?

    电阻触摸屏 3. 校准添加 电阻式触摸屏在实际应用中必须进行校准,而校准有多种方法,一种是使用TouchGFX自带的
    的头像 发表于 01-21 10:14 3959次阅读
    如何在<b class='flag-5'>TouchGFX</b>框架下实现校准电阻<b class='flag-5'>触摸</b>屏?

    实战经验 | TouchGFX 控件附加 ClickListener 功能方法介绍

    Designer 中的 Mixin 功能,从基础示例 Button Example 出发,为文本框控件添加 ClickListener (Mixin 功能中的一项),并对源代码进行简
    的头像 发表于 11-17 17:40 594次阅读