GPIO 中断示例

功能说明

演示如何使用 GPIO 中断功能实现事件驱动的引脚状态检测,通过配置下降沿中断,在引脚电平由高变低时自动触发中断回调,无需 CPU 轮询,降低功耗。示例支持 ARCS EVB 和 Venusa RD EVB,构建时会根据 BOARD 选择对应的中断引脚。

新特性

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

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

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

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

硬件连接

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

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

可通过外接按钮将当前板型的中断引脚与 GND 连接。按下按钮或将引脚稳定接地时,引脚电平由高变低,触发下降沿中断。

使用场景

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

示例步骤

  1. 根据板型获取 GPIOA 设备和对应的中断引脚(ARCS EVB 使用 PA23,Venusa RD EVB 使用 PA13)

  2. 配置板型对应的引脚为输入模式,启用上拉电阻

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

  4. 使能板型对应的引脚中断

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

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

编译

重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:

  1. 确认示例限制:查看当前示例 README 中的硬件连接和注意事项,确认是否限定板型。

  2. 参考示例配置:查看相关示例目录下的 sample.yaml,确认支持的板型。

  3. 填写板型标识:SDK 内置板型的标识为 boards/ 下的目录名。例如实际使用的板型目录为 boards/<板型名称>/,则编译参数填写为 -DBOARD=<板型名称>

在 SDK 根目录执行编译,并将命令中的 <示例路径><板型名称> 替换为实际值。

Linux 使用 build.sh

# 通用命令
./build.sh -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

Windows PowerShell 使用 build.ps1

# 通用命令
.\build.ps1 -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
.\build.ps1 -C -S samples/<示例路径> -DBOARD=arcs_evb

Note

确保已安装对应平台的工具链和 ListenAI 开发工具包。Windows 环境请先执行 .\env.ps1 或直接使用 .\build.ps1 自动加载环境。

注意事项-DBOARD 填写的是板型标识,不是芯片系列名称。如果示例有板型专用配置或额外编译参数,以示例 README 中的说明为准。

烧录

编译完成后,使用 SDK tools/burn 目录下的 cskburn 工具烧录固件。请先根据目标板型和当前示例确定芯片系列、串口设备、烧录地址和固件路径。

Linux:

# 通用命令
./tools/burn/cskburn -C <芯片系列> -s <串口设备> -b 3000000 <烧录地址> <固件路径>

# 示例:使用 arcs_evb 开发板
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Windows PowerShell:

# 通用命令
.\tools\burn\cskburn.exe -C <芯片系列> -s <串口号> -b 3000000 <烧录地址> <固件路径>

# 示例:使用 arcs_evb 开发板
.\tools\burn\cskburn.exe -C arcs -s COM7 -b 3000000 0x0 .\build\arcs.bin

Note

烧录参数说明

  • -s /dev/ttyUSB0 / -s COM7:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - Windows 系统:通常是 COM7COM8 等,可在“设备管理器”的“端口”中查看 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin / .\build\arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

预期输出

ARCS EVB 终端输出:

=== LISA GPIO interrupt example ===
Waiting for interrupt...
Waiting for interrupt...
Interrupt triggered on gpioa pin 23
Waiting for interrupt...
...

Venusa RD EVB 终端输出:

=== LISA GPIO interrupt example ===
Waiting for interrupt...
Waiting for interrupt...
Interrupt triggered on gpioa pin 13
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: 低电平触发(引脚为低电平时持续触发)

推荐使用边沿触发模式,避免电平触发模式下的重复中断。

关键代码

/* 根据板型选择 GPIO 设备和中断引脚 */
#if defined(CONFIG_BOARD_ARCS_EVB)
#define GPIO_DEVICE "gpioa"
#define GPIO_PIN    23
#elif defined(CONFIG_BOARD_VENUSA_RD_EVB)
#define GPIO_DEVICE "gpioa"
#define GPIO_PIN    13
#endif

/* 中断回调函数 */
static void button_irq_callback(uint32_t pin, void *user_data)
{
    lisa_device_t *gpio_dev = (lisa_device_t *)user_data;

    /* 处理完中断后禁用中断,防止重复触发 */
    lisa_gpio_disable_irq(gpio_dev, pin);
    LISA_LOGI(LOG_TAG, "Interrupt triggered on %s pin %d", gpio_dev->name, 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);

配置说明

公共的 prj.conf 启用 LISA 设备框架和 GPIOA 驱动:

CONFIG_LISA_DEVICE=y
CONFIG_LISA_GPIO_DEVICE=y
CONFIG_LISA_GPIOA=y

sample.yaml 中已配置 arcs_evbvenusa_rd_evb 两个测试平台。构建时根据 BOARD 宏选择引脚,两块开发板均使用 GPIOA,无需额外的板型专用 GPIO 配置。

开发板

BOARD

板型宏

GPIO 设备

中断引脚

ARCS EVB

arcs_evb

CONFIG_BOARD_ARCS_EVB

gpioa

PA23

Venusa RD EVB

venusa_rd_evb

CONFIG_BOARD_VENUSA_RD_EVB

gpioa

PA13

中断回调函数

中断回调函数原型:

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. 去抖动:按键或飞线手动短接 GND 时可能因机械触点不稳定产生多个下降沿,建议使用稳定连接,并在需要持续使能中断的应用中增加软件去抖