LISA GPIO 中断示例

功能说明

演示如何使用 GPIO 中断功能实现事件驱动的引脚状态检测,通过配置下降沿中断,在引脚电平由高变低时自动触发中断回调,无需 CPU 轮询,降低功耗。

新特性

  • 事件驱动:引脚状态变化时自动触发中断,无需主动轮询

  • 低功耗:CPU 可进入休眠状态,等待中断唤醒

  • 实时响应:硬件中断响应速度快,适合对时序敏感的场景

  • 多种触发模式:支持边沿触发和电平触发,满足不同应用需求

硬件连接

  • PA23: GPIO 输入引脚(配置为上拉输入,下降沿中断)

可通过外接按钮连接 PA23 引脚到 GND,按下按钮时引脚电平由高变低,触发下降沿中断。

使用场景

适用于需要实时响应外部事件的场景(如按键检测、传感器信号检测等),通过中断方式可以避免轮询带来的 CPU 占用,同时提高响应速度。

示例步骤

  1. 获取 GPIOA 设备

  2. 配置 PA23 引脚为输入模式,启用上拉电阻

  3. 配置下降沿中断,设置中断回调函数

  4. 使能 PA23 引脚中断

  5. 等待中断触发(主循环进入低功耗等待)

  6. 中断触发时执行回调函数,打印日志并禁用中断

编译

重要提示:在编译前,请先确认您使用的开发板型号。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

说明

lisa_device_get()

获取 GPIO 设备

lisa_device_ready()

检查设备是否就绪

lisa_gpio_configure()

配置 GPIO 引脚模式和属性

lisa_gpio_configure_irq()

配置 GPIO 中断模式和回调函数

lisa_gpio_enable_irq()

使能 GPIO 引脚中断

lisa_gpio_disable_irq()

禁用 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);  /* 传递设备指针 */

注意事项

  1. 回调上下文:中断回调函数在中断上下文中执行,应尽快返回,避免耗时操作

  2. 中断嵌套:避免在回调函数中执行可能引发中断嵌套的操作

  3. 禁用中断:示例中在回调函数中禁用中断,防止重复触发。实际应用中可根据需求决定是否禁用

  4. 线程安全:如需在回调中访问共享资源,注意使用合适的同步机制

  5. 去抖动:按键等机械触点可能产生抖动,建议在应用层实现软件去抖动