跳转到主要内容

9. 触摸控制器

动机

必须能够从触摸控制器读取触摸坐标,以便用户与应用程序进行交互。 此处开发的代码将被用于以后开发TouchGFX抽象层。

Note
如果您的开发板不带触摸控制器,请跳过该步。

目标

此步骤的目标是确保从显示屏的触摸控制器可靠读取触摸坐标。

验证

以下是本节的验证点:

验证点基本原理
已配置触摸控制器和MCUMCU必须配置为通过I2C等从触摸控制器读取信息。
可读取触摸控制器寄存器TouchGFX抽象层可使用此代码从控制器获取触摸坐标。
读取操作按预期进行轮询是应用程序渲染时间的一部分。 如果触摸轮询花费的时间太长,则应将其移至其他线程,或基于中断读取坐标。

先决条件

  • 带触摸控制器的显示屏
  • 用于从触摸控制器读取数据的驱动程序

执行

此步骤包含两个元素:基于触摸控制器的通信需求,对MCU进行配置,同时编写驱动程序实现MCU与触摸控制器的对话。

大多数触摸控制器连接至I2C总线。 在STM32CubeMX中,I2C通信在 Connectivity -> I2C1: I2C1下进行配置:

配置I2C

许多STM32 MCU具有不止一个I2C控制器,因此请选择一个连接至触摸控制器。 另外,请记住配置相关GPIO。

如果您没有用于触摸控制器的驱动代码,则需要从头开始编写。 MCU的STM32Cube固件包含了I2C通信示例。 这些示例可作为起点。 根据触摸控制器的数据手册,确认通过读取哪些寄存器可以获取触摸坐标。 首先要检查的是触摸控制器的I2C地址,然后读取“设备ID”寄存器,以进行测试。

您需要开发驱动程序确保I2C正常运行,稍后与TouchGFX集成时将用到此函数。 如果有触摸,函数应返回真值并提供坐标,否则返回假值。

以下示例显示了此代码的框架,驱动程序代码被函数myTouchController_GetState抽象化:

main.c
    uint16_t x;
uint16_t y;

TouchControllerState state;
if (myTouchController_GetState(&state))
{
x = state.touchY;
y = state.touchX;
//break point here
}

借助调试器检查是否可以从触摸控制器接收到正确的x值和y值。

一些触摸控制器能够报告多个触摸点。 TouchGFX不支持此功能,此处忽略。 通常,您只需选择第一个接触点。

"TouchGFX AL开发”文章抽象层解释了如何将这些值发送至TouchGFX。

性能符合预期

如果触摸代码与TouchGFX应用程序在相同的线程中执行,则触摸采样可以在1 ms内完成。 如果速度不够快,请考虑后期将这部分代码作为其它独立任务。