LISA Touch 轮询模式示例
功能说明
本示例演示如何使用 LISA Touch 驱动的轮询模式读取触摸屏坐标。
在轮询模式下,主循环定期调用 lisa_touch_read_event() 读取触摸数据,不依赖 GPIO 中断,通过持续轮询检测触摸事件。实现简单,适合对实时性要求不高的应用。
硬件连接
PA22: I2C SDA 引脚
PA23: I2C SCL 引脚
PA25: Touch 复位引脚(RST)
PA24: Touch 中断引脚(INT,轮询模式下不使用)
示例步骤
获取 Touch、I2C 和 GPIO 设备
配置 I2C 和 GPIO 引脚复用(通过 pinmux 重定向)
配置 Touch 总线接口
设置轮询模式(
LISA_TOUCH_INT_MODE_POLLING)启用 Touch 设备
循环读取触摸事件并显示坐标(50ms 采样间隔)
编译运行
./build.sh -C -DBOARD=arcs_evb
预期输出
终端输出:
=== LISA Touch Polling Mode Example ===
I2C pins configured (SDA: PA22, SCL: PA23)
GPIO pins configured (RST: PA25, INT: PA24)
touch_cst328 device ready
i2c0 device ready
gpioa device ready
Touch bus attached successfully
Touch polling mode enabled
Touch device enabled
Touch capabilities: max_x=240, max_y=320, max_points=1
=== Polling Mode Active ===
Start reading touch events (polling every 50ms)...
Press the touch screen to see coordinates
[Polling] Touch: x= 120, y= 160, type=PRESS
[Polling] Touch: x= 125, y= 165, type=PRESS
[Polling] Touch: type=RELEASE
...
核心 API
API |
说明 |
|---|---|
|
获取 Touch、I2C 和 GPIO 设备 |
|
配置 Touch 总线接口(I2C、GPIO) |
|
设置轮询模式 |
|
启用 Touch 设备 |
|
读取触摸事件(坐标、状态) |
关键代码
设置轮询模式
lisa_touch_set_int_mode(touch_dev, LISA_TOUCH_INT_MODE_POLLING);
此函数会禁用 GPIO 中断(如果之前已启用),确保设备处于轮询模式。
读取触摸事件
lisa_touch_event_t event;
int ret = lisa_touch_read_event(touch_dev, &event);
if (ret == 0) {
if (event.type == LISA_TOUCH_EVENT_PRESS && event.point_count > 0) {
printf("[Polling] Touch: x=%4d, y=%4d, type=PRESS\n",
event.points[0].x, event.points[0].y);
} else if (event.type == LISA_TOUCH_EVENT_RELEASE) {
printf("[Polling] Touch: type=RELEASE\n");
}
}
调整轮询间隔
vTaskDelay(pdMS_TO_TICKS(50)); /* 50ms采样间隔 */
可以根据应用需求调整:
更快的响应:减小延迟(如 20ms),但会增加 CPU 占用
更低的功耗:增大延迟(如 100ms),但响应会变慢
配置说明
在 prj.conf 中启用相关驱动:
CONFIG_LISA_DEVICE=y
CONFIG_LISA_TOUCH_DEVICE=y
CONFIG_LISA_TOUCH_ARCS_CST328=y # 启用 CST328 芯片
CONFIG_LISA_I2C=y
CONFIG_LISA_I2C0=y
CONFIG_LISA_GPIO_DEVICE=y
CONFIG_LISA_GPIOA=y
轮询模式说明
轮询模式的工作原理:
实现方式:主循环定期调用
lisa_touch_read_event()读取触摸数据无需中断:不依赖 GPIO 中断,适合没有中断引脚或中断资源紧张的场景
可控采样率:可以灵活调整轮询间隔(本示例为 50ms)
线程安全:驱动内部使用互斥锁保护,确保多线程环境下的数据一致性
注意事项
轮询间隔:间隔太短会导致 CPU 占用高、功耗大;间隔太长会导致响应延迟大,可能丢失快速触摸。建议范围:20ms ~ 100ms
线程安全:驱动内部使用互斥锁保护,可以在多线程环境中安全使用
引脚配置:示例中通过 pinmux 重定向自定义引脚配置,会覆盖
boards/arcs_evb/pinmux.c中的默认实现I2C 配置:I2C 总线在
attach_bus时自动配置(标准速度 100kHz)性能考虑:如果对实时性和功耗有要求,建议使用中断模式