目录
3.5 gpio_callback_func 函数:中断回调逻辑
官方文档:点击跳转
1. 准备工作
1.1 环境准备
- 准备一块BearPi-Pico H3863开发板和母对母杜邦线(用杜邦线短接模拟按键按下)
- 完成环境搭建(SDK中自带按键中断案例)
- 根据官方文档教程,完成Windows环境下开发环境搭建
- 或者根据Windows环境下小熊派Hi3863环境搭建与输出HelloWorld 进行环境搭建
1.2 原理图
本次通过杜邦线短接GPIO0和GND来模拟按键按下
1.3 案例代码完善
2. 编译烧录
2.1编译
2.2 烧录
3. 代码详解
3.1 程序的运行流程
- 入口函数 app_run(button_entry):启动程序,调用 button_entry
- button_entry 函数:初始化按钮的GPIO引脚,配置为输入模式并注册中断回调函数 gpio_callback_func
- gpio_callback_func 函数:当按钮被按下时触发,打印消息“Button pressed.”到调试控制台
3.2 源码
/**
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
*
* Description: Button Sample Source. \n
*
* History: \n
* 2023-04-03, Create file. \n
*/
#include "pinctrl.h"
#include "gpio.h"
#include "osal_debug.h"
#include "cmsis_os2.h"
#include "app_init.h"
#define CONFIG_BUTTON_PIN 0
static void gpio_callback_func(pin_t pin, uintptr_t param)
{
UNUSED(pin);
UNUSED(param);
osal_printk("Button pressed.\r\n");
}
static void button_entry(void)
{
uapi_pin_set_mode(CONFIG_BUTTON_PIN, HAL_PIO_FUNC_GPIO);
uapi_pin_set_pull(CONFIG_BUTTON_PIN, PIN_PULL_TYPE_UP);
uapi_gpio_set_dir(CONFIG_BUTTON_PIN, GPIO_DIRECTION_INPUT);
uapi_gpio_register_isr_func(CONFIG_BUTTON_PIN, GPIO_INTERRUPT_DEDGE, gpio_callback_func);
}
/* Run the button_entry. */
app_run(button_entry);
3.3 入口函数 app_run:程序的起点
app_run(button_entry);
3.4 button_entry 函数:初始化按钮
static void button_entry(void)
{
uapi_pin_set_mode(CONFIG_BUTTON_PIN, HAL_PIO_FUNC_GPIO);
uapi_pin_set_pull(CONFIG_BUTTON_PIN, PIN_PULL_TYPE_UP);
uapi_gpio_set_dir(CONFIG_BUTTON_PIN, GPIO_DIRECTION_INPUT);
uapi_gpio_register_isr_func(CONFIG_BUTTON_PIN, GPIO_INTERRUPT_DEDGE, gpio_callback_func);
}
在 button_entry 函数中,程序依次完成了以下初始化操作:
- uapi_pin_set_mode(CONFIG_BUTTON_PIN, HAL_PIO_FUNC_GPIO):将按钮引脚模式设置为普通GPIO功能
- uapi_pin_set_pull(CONFIG_BUTTON_PIN, PIN_PULL_TYPE_UP):将按钮引脚设置为上拉模式,确保在未按下时为高电平
- uapi_gpio_set_dir(CONFIG_BUTTON_PIN, GPIO_DIRECTION_INPUT):将按钮引脚方向设置为输入模式
- uapi_gpio_register_isr_func(CONFIG_BUTTON_PIN, GPIO_INTERRUPT_DEDGE, gpio_callback_func):注册中断回调函数,当按钮按下时触发 gpio_callback_func
3.5 gpio_callback_func 函数:中断回调逻辑
static void gpio_callback_func(pin_t pin, uintptr_t param)
{
UNUSED(pin);
UNUSED(param);
osal_printk("Button pressed.\r\n");
}
- UNUSED(pin) 和 UNUSED(param):标记函数参数未使用,避免编译器警告。
- osal_printk("Button pressed.\r\n"):当按钮被按下时,打印消息“Button pressed.”到调试控制台,提示按钮被触发。
4. 现象观察
打开串口工具
使用杜邦线短接GPIO0和GND
打印输出Button pressed