LISA Touch 轮询模式示例
源码位置: samples/drivers/devices/lisa_touch/polling_mode 查看源码
功能说明
本示例演示如何使用 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 采样间隔)
编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
烧录
编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
Note
烧录参数说明:
-s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是/dev/ttyUSB0或/dev/ttyACM0- 可通过ls /dev/tty*命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名-b 3000000:烧录波特率(3Mbps)0x0:烧录起始地址build/arcs.bin:编译生成的固件路径-C arcs:芯片类型
注意事项:
确保开发板已正确连接到电脑
如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口
预期输出
终端输出:
=== 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= 121, y= 161, 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) {
switch (event.type) {
case LISA_TOUCH_EVENT_PRESS:
/* 按下事件 */
if (event.point_count > 0) {
printf("[Polling] Touch: x=%4d, y=%4d, type=PRESS\n",
event.points[0].x, event.points[0].y);
}
break;
case LISA_TOUCH_EVENT_RELEASE:
/* 释放事件 */
printf("[Polling] Touch: type=RELEASE\n");
break;
}
}
调整轮询间隔
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)
线程安全:驱动内部使用互斥锁保护,确保多线程环境下的数据一致性
事件类型行为
驱动检测到触摸状态并返回相应的事件类型:
触摸操作 |
返回事件类型 |
说明 |
|---|---|---|
按下 |
|
检测到触摸时返回,包含坐标信息 |
释放 |
|
检测到释放时返回 |
无触摸 |
|
无触摸事件 |
说明:
轮询模式下,每次读取时如果触摸状态为按下,都会返回
PRESS事件如果手指在滑动,坐标会在每次
PRESS事件中更新检测到释放时返回
RELEASE事件
示例输出序列(50ms 轮询间隔,手指持续按下 200ms 后抬起):
[Polling] Touch: x= 120, y= 160, type=PRESS // 0ms: 检测到按下
[Polling] Touch: x= 120, y= 160, type=PRESS // 50ms: 持续按下(坐标未变)
[Polling] Touch: x= 121, y= 161, type=PRESS // 100ms: 持续按下(坐标更新)
[Polling] Touch: x= 125, y= 165, type=PRESS // 150ms: 持续按下(滑动,坐标更新)
[Polling] Touch: type=RELEASE // 200ms: 检测到释放
注意事项
模式互斥:轮询模式和中断模式是互斥的
在轮询模式下,使用
lisa_touch_read_event()主动读取触摸事件如需切换到中断模式,请先调用
lisa_touch_set_int_mode(LISA_TOUCH_INT_MODE_INTERRUPT)并设置回调函数⚠️ 设置为中断模式后,不能再调用
lisa_touch_read_event(),否则返回错误
轮询间隔:间隔太短会导致 CPU 占用高、功耗大;间隔太长会导致响应延迟大,可能丢失快速触摸。建议范围:20ms ~ 100ms
线程安全:驱动内部使用互斥锁保护,可以在多线程环境中安全使用
引脚配置:示例中通过 pinmux 重定向自定义引脚配置,会覆盖
boards/arcs_evb/pinmux.c中的默认实现I2C 配置:I2C 总线在
attach_bus时自动配置(标准速度 100kHz)性能考虑:如果对实时性和功耗有要求,建议使用中断模式