本示例演示如何使用 MCU 的按键中断功能,通过按键 K3 触发外部中断控制输出串口信息。
GPIO_DT_SPEC_GET_OR (node_id, prop, default_value)
返回 Devicetree 中指定的 GPIO 引脚属性的静态初始值设定项
参数说明
字段 | 说明 |
---|---|
node_id | DeviceTree 节点标识符 |
prop | 小写和下划线属性名称 |
default_value | 要扩展的回退值 |
K_SEM_DEFINE (name, initial_count, count_limit)
静态定义和初始化信号量。
参数说明
字段 | 说明 |
---|---|
name | 信号量的名称 |
initial_count | 初始信号量计数 |
count_limit | 允许的最大信号量计数 |
{SDK}\.sdk\csk\samples\driver\key_interrupt
演示如何使用 MCU 的按键中断功能,通过按键 K3 触发外部中断控制输出串口信息。
适用开发板:大模型开发套件
编译版型:csk6_duomotai_devkit
使用引脚:
在 SDK 根目录(duomotai_ap
)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit .sdk/csk/samples/driver/key_interrupt/ -p
编译完成后,编译产物二进制文件位于 build\zephyr\zephyr.bin
使用 Type-C 数据线连接开发套件的 DAP_USB
接口,选中以下其中一种方式对固件进行烧录:
cskburn desktop
是一款聆思推出的桌面烧录工具,在下载并安装 cskburn desktop 烧录工具后,双击图标运行软件:
1.点击串口下拉框,选择连接开发套件后识别到的串口编号;
2.将编译输出的.bin
文件拖拽进烧录区域;
3.点击开始烧录,等待烧录完成。
若您已按照 《环境搭建》 教程完成开发环境的安装,可在编译完成后执行 lisa zep exec cskburn
指令完成烧录。
lisa zep exec cskburn -s \\.\COMxx -C 6 -b 1500000 0x000000 --verify-all .\build\zephyr\zephyr.bin
请将命令行中的的 COMx 替换为开发套件在 PC 上对应的串口号(可通过设备管理器查看)。例如:
COM3
。
lisa zep exec cskburn -s PORT -C 6 0x000000 --verify-all ./build/zephyr/zephyr.bin -b 1500000
请将命令行中的 PORT 替换为开发套件连接在 PC 上对应的串口号。例如:
/dev/ttyUSB0
。
烧录完成后,连接串口终端,当按动开发板 K3 按键时,可看到串口有对应的信息输出。
以下代码与注释已省略一部分非关键接口代码,主要呈现示例的主业务流程与主要接口的使用。
在工程目录 prj.conf
文件中需使能以下模块:
CONFIG_GPIO=y
1.从设备树中获取按键设备的配置信息
static const struct gpio_dt_spec key_3 = GPIO_DT_SPEC_GET_OR(SW0_NODE, gpios, {0});
2.定义回调按键中断回调函数
static struct gpio_callback key_3_cb_data;
3.设置信号量
K_SEM_DEFINE(key_sem, 0, 1);
4.按键初始化,设置并添加回调
r = key_init();
5.串口打印,判断按键中断是否成功
key_interrupt_led();
int key_init(void)
{
int ret;
if (!gpio_is_ready_dt(&key_3)) {
printk("Error: key_3 device %s is not ready\n", key_3.port->name);
return -ENODEV;
}
ret = gpio_pin_configure_dt(&key_3, GPIO_INPUT);
if (ret != 0) {
printk("Error %d: failed to configure %s pin %d\n", ret, key_3.port->name,
key_3.pin);
return ret;
}
ret = gpio_pin_interrupt_configure_dt(&key_3, GPIO_INT_EDGE_TO_ACTIVE);
if (ret != 0) {
printk("Error %d: failed to configure interrupt on %s pin %d\n", ret,
key_3.port->name, key_3.pin);
return ret;
}
gpio_init_callback(&key_3_cb_data, key_3_pressed, BIT(key_3.pin));
gpio_add_callback(key_3.port, &key_3_cb_data);
printk("Set up key_3 at %s pin %d\n", key_3.port->name, key_3.pin);
return 0;
}