LISA GPIO 中断示例
源码位置: samples/drivers/devices/lisa_gpio/interrupt 查看源码
功能说明
演示如何使用 GPIO 中断功能实现事件驱动的引脚状态检测,通过配置下降沿中断,在引脚电平由高变低时自动触发中断回调,无需 CPU 轮询,降低功耗。
新特性
事件驱动:引脚状态变化时自动触发中断,无需主动轮询
低功耗:CPU 可进入休眠状态,等待中断唤醒
实时响应:硬件中断响应速度快,适合对时序敏感的场景
多种触发模式:支持边沿触发和电平触发,满足不同应用需求
硬件连接
PA23: GPIO 输入引脚(配置为上拉输入,下降沿中断)
可通过外接按钮连接 PA23 引脚到 GND,按下按钮时引脚电平由高变低,触发下降沿中断。
使用场景
适用于需要实时响应外部事件的场景(如按键检测、传感器信号检测等),通过中断方式可以避免轮询带来的 CPU 占用,同时提高响应速度。
示例步骤
获取 GPIOA 设备
配置 PA23 引脚为输入模式,启用上拉电阻
配置下降沿中断,设置中断回调函数
使能 PA23 引脚中断
等待中断触发(主循环进入低功耗等待)
中断触发时执行回调函数,打印日志并禁用中断
编译
重要提示:在编译前,请先确认您使用的开发板型号。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 GPIO interrupt example ===
Waiting for interrupt...
Waiting for interrupt...
Interrupt triggered on gpioa pin 23
Waiting for interrupt...
Waiting for interrupt...
...
核心 API
API |
说明 |
|---|---|
|
获取 GPIO 设备 |
|
检查设备是否就绪 |
|
配置 GPIO 引脚模式和属性 |
|
配置 GPIO 中断模式和回调函数 |
|
使能 GPIO 引脚中断 |
|
禁用 GPIO 引脚中断 |
中断模式说明
GPIO 中断支持多种触发模式,可根据应用场景选择:
边沿触发模式
LISA_GPIO_IRQ_EDGE_RISING: 上升沿触发(低电平 → 高电平)LISA_GPIO_IRQ_EDGE_FALLING: 下降沿触发(高电平 → 低电平)LISA_GPIO_IRQ_EDGE_BOTH: 双边沿触发(任意电平变化)
电平触发模式
LISA_GPIO_IRQ_LEVEL_HIGH: 高电平触发(引脚为高电平时持续触发)LISA_GPIO_IRQ_LEVEL_LOW: 低电平触发(引脚为低电平时持续触发)
推荐使用边沿触发模式,避免电平触发模式下的重复中断。
关键代码
/* 中断回调函数 */
static void button_irq_callback(uint32_t pin, void *user_data)
{
lisa_device_t *gpio_dev = (lisa_device_t *)user_data;
LISA_LOGI(LOG_TAG, "Interrupt triggered on %s pin %d", gpio_dev->name, pin);
/* 处理完中断后禁用中断,防止重复触发 */
lisa_gpio_disable_irq(gpio_dev, pin);
}
/* 配置为输入模式,启用上拉 */
int ret = lisa_gpio_configure(gpio_dev, GPIO_PIN,
LISA_GPIO_INPUT | LISA_GPIO_PULL_UP);
/* 配置下降沿中断 */
ret = lisa_gpio_configure_irq(gpio_dev, GPIO_PIN,
LISA_GPIO_IRQ_EDGE_FALLING,
button_irq_callback,
gpio_dev); /* 传递设备指针作为 user_data */
/* 使能中断 */
ret = lisa_gpio_enable_irq(gpio_dev, GPIO_PIN);
配置说明
中断回调函数
中断回调函数原型:
void callback(uint32_t pin, void *user_data);
pin: 触发中断的引脚编号user_data: 用户自定义数据指针,在配置中断时传入
用户数据传递
可通过 user_data 参数传递上下文信息(如设备指针、状态变量等):
lisa_gpio_configure_irq(gpio_dev, GPIO_PIN,
LISA_GPIO_IRQ_EDGE_FALLING,
button_irq_callback,
gpio_dev); /* 传递设备指针 */
注意事项
回调上下文:中断回调函数在中断上下文中执行,应尽快返回,避免耗时操作
中断嵌套:避免在回调函数中执行可能引发中断嵌套的操作
禁用中断:示例中在回调函数中禁用中断,防止重复触发。实际应用中可根据需求决定是否禁用
线程安全:如需在回调中访问共享资源,注意使用合适的同步机制
去抖动:按键等机械触点可能产生抖动,建议在应用层实现软件去抖动