OpenHarmony驱动子系统开发—GPIO按键事件中断

本案例程序是演示GPIO中断接口的基本使用,案例操作结果是通过按键切换开发板上的LED的点亮和熄灭效果。

本案例使用的按键根据开发板原理图可以得到,接入的是GPIO5号引脚。所以本次开发驱动的GPIO引脚是GPIO5。

按键和LED灯在开发板的位置如下图红色框框标记所示,按键在上,LED灯在下:

GPIO函数使用

IoTGpioRegisterIsrFunc()

IoTGpioRegisterIsrFunc函数是一个设置GPIO引脚中断的函数,函数返回初始化结果。此函数在管脚使用之前调用,避免重复调用,避在再中断中使用。

描述:

启用GPIO引脚的中断功能。这个函数可以用来为GPIO pin设置中断类型、中断极性和中断回调。

参数:

名字 描述
id 表示GPIO引脚号.
intType 表示中断类型.
intPolarity 表示中断触发方式.
func 表示中断回调函数.
arg 表示中断回调函数中使用的参数的指针

案例程序解析

本案例通过按键按压时触发的边沿中断,在中断回调函数中更改LED灯的输出电平,来达到按压一次按键,实现点灯和熄灯的效果。

由于开发板物理按键存在抖动的问题,会在按压一次按键时,多次触发中断回调,所以我们需要在中断回调函数中,进行软件防抖操作,过滤掉一些不必要的操作。

c 复制代码
static unsigned int lastTickCount = 0;
static unsigned int led_Level = 0;

//GPIO5中断回调函数
void GpioPressedIsrFunc(char *arg)
{
    (void)arg;

    //消除按键抖动
    unsigned int tickCount = osKernelGetTickCount();
    unsigned int count = tickCount - lastTickCount;
    lastTickCount = tickCount;

    if (count > 50)
    {
        led_Level ^= 1;
        IoTGpioSetOutputVal(IOT_GPIO_IO_GPIO_9, led_Level);
    }
}

static void *ClickKeyTask(const char *arg)
{
    (void)arg;
    unsigned int ret;

    printf("----- gpio isr demo -----\r\n");

    IoTGpioInit(IOT_GPIO_IO_GPIO_9);
    IoTIoSetFunc(IOT_GPIO_IO_GPIO_9, HI_IO_FUNC_GPIO_9_GPIO);
    IoTGpioSetDir(IOT_GPIO_IO_GPIO_9, IOT_GPIO_DIR_OUT);
    IoTGpioSetOutputVal(IOT_GPIO_IO_GPIO_9, IOT_GPIO_VALUE0);

    //初始化GPIO5引脚
    IoTGpioInit(IOT_GPIO_IO_GPIO_5);
    IoTIoSetFunc(IOT_GPIO_IO_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO);
    IoTIoSetPull(IOT_GPIO_IO_GPIO_5, IOT_IO_PULL_UP);
    IoTGpioSetDir(IOT_GPIO_IO_GPIO_5, IOT_GPIO_DIR_IN);

    //设置GPIO5中断
    ret = IoTGpioRegisterIsrFunc(IOT_GPIO_IO_GPIO_5, IOT_INT_TYPE_EDGE,
                                 IOT_GPIO_EDGE_FALL_LEVEL_LOW, GpioPressedIsrFunc, NULL);
    if (ret != RET_OK)
    {
        printf("===== ERROR ======gpio -> hi_gpio_register_isr_function ret:%d\r\n", ret);
    }

    return NULL;
}

编译调试

修改 BUILD.gn 文件

修改 applications\app路径下 BUILD.gn 文件,指定 exti_key_example 参与编译。

C 复制代码
# "TW001_OS_helloworld:helloworld",
#"TW002_OS_thread:os_thread_example",
#"TW003_OS_timer:os_timer_example",
#"TW004_OS_event:os_event_example",
#"TW005_OS_mutex:os_mutex_example",
#"TW006_OS_semp:os_semp_example",
#"TW007_OS_message:os_message_example",
#"TW101_GPIO_led:gpio_led_example",
"TW102_EXTI_key:exti_key_example",
#"TW103_PWM_led:pwm_led_example",
#"TW104_ADC_voltage:adc_voltage_example",
#"TW105_I2C_sht30:i2c_sht30_example",
#"TW106_UART:uart_example",
#"TW301_APP_oled:app_oled_example",
#"TW302_APP_nfc:app_nfc_example"
运行结果

示例代码编译烧录代码后,按下开发板的RESET按键,开发板开始正常工作,此时LED会正常点亮,再按下按键LED会熄灭,再按下按键LED会重新点亮。

注意事项

使用前需要用两个跳线帽短接核心板左侧两个引脚,参考下图图示。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ......

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题

2.性能优化方向

3.架构方向

4.鸿蒙开发系统底层方向

5.鸿蒙音视频开发方向

6.鸿蒙车载开发方向

7.鸿蒙南向开发方向

相关推荐
格里姆肖19 分钟前
小米铁蛋电机1代驱动开发
单片机·嵌入式硬件
hazy1k20 分钟前
51单片机基础-LCD1602液晶显示
stm32·单片机·嵌入式硬件·51单片机·1024程序员节
aiguangyuan4 小时前
uni-app开发入门手册
uni-app·移动开发·前端开发
猫林老师4 小时前
HarmonyOS自动化测试与持续集成实战指南
ci/cd·华为·harmonyos
寂然如故5 小时前
拥抱未来:HarmonyOS NEXT 开发新范式深度解析
华为·harmonyos
国霄5 小时前
(2)Kotlin/Js For Harmony——如何复用ViewModel
harmonyos
兆龙电子单片机设计5 小时前
【STM32项目开源】STM32单片机医疗点滴控制系统
stm32·单片机·开源·毕业设计·电子信息
星释5 小时前
鸿蒙Flutter三方库适配指南:08.联合插件开发
flutter·华为·harmonyos
爱笑的眼睛115 小时前
HarmonyOS WaterFlow瀑布流布局深度解析:从原理到性能优化
华为·harmonyos
星释5 小时前
鸿蒙Flutter三方库适配指南:06.插件适配原理
flutter·华为·harmonyos