9. 触摸控制器
动机
必须能够从触摸控制器读取触摸坐标,以便用户与应用程序进行交互。 此处开发的代码将被用于以后开发TouchGFX抽象层。
Note
如果您的开发板不带触摸控制器,请跳过该步。
目标
此步骤的目标是确保从显示屏的触摸控制器可靠读取触摸坐标。
验证
以下是本节的验证点:
验证点 | 基本原理 |
---|---|
已配置触摸控制器和MCU | MCU必须配置为通过I2C等从触摸控制器读取信息。 |
可读取触摸控制器寄存器 | TouchGFX抽象层可使用此代码从控制器获取触摸坐标。 |
读取操作按预期进行 | 轮询是应用程序渲染时间的一部分。 如果触摸轮询花费的时间太长,则应将其移至其他线程,或基于中断读取坐标。 |
先决条件
- 带触摸控制器的显示屏
- 用于从触摸控制器读取数据的驱动程序
执行
此步骤包含两个元素:基于触摸控制器的通信需求,对MCU进行配置,同时编写驱动程序实现MCU与触摸控制器的对话。
大多数触摸控制器连接至I2C总线。 在STM32CubeMX中,I2C通信在 Connectivity -> I2C1: I2C1下进行配置:
许多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内完成。 如果速度不够快,请考虑后期将这部分代码作为其它独立任务。