当前位置:   article > 正文

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

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

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

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

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

GPIO函数使用

IoTGpioRegisterIsrFunc()

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

描述:

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

参数:

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

案例程序解析

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

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

编译调试

修改 BUILD.gn 文件

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

# "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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
运行结果

示例代码编译烧录代码后,按下开发板的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.鸿蒙南向开发方向

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/456525
推荐阅读
  

闽ICP备14008679号