HaaS EDU K1设备资源 之 KEY

1、背景介绍


HaaS EDU K1是HaaS Education Kit1的缩写,是基于四核高性能MCU-HaaS1000芯片打造的、集颜值和内涵于一身的物联网教育开发板。

关于整体硬件介绍,有兴趣可参考HaaS EDU K1硬件介绍

关于设备资源整体介绍,有兴趣可参考HaaS EDU K1设备资源总体介绍

 

在本文中,我们将利用板载的3个按键,来学习按键部分的实现。通过本文的学习,你将了解到IO口作为输入口以及GPIO中断的使用方法。

GPIO章节中已经详细介绍了GPIO的使用接口,请参考HaaS EDU K1设备资源 之 GPIO

HaaS EDU K1板载了四个按键,如下图中所示。分别是K1,k2, K3,K4。

                                                          图1 HaaS EDU K1平面图

四个按键对应的GPIO分别是:

按键名

对应的GPIO映射

GPIO模式

K1

GPIO_P2_7

输入模式

K2

GPIO_P2_4

输入模式

K3

GPIO_P2_5

输入模式

K4

GPIO_P3_2

输入模式

 

2、示例介绍

IO口在前面章节已经有了比较详细的介绍,这里我们不再多说。IO口做输入使用的时候,有两种方式,一个是直接读取IO口的电平值,这种叫Polling;另外一种是通过中断方式,比如IO口有输入的时候,就会触发一个中断。

了解了这点,就可以开始我们的代码编写了。

我们将通过板上载有的3个按钮(K1、K2和K3)来学习。

 

2.1、硬件实现

本章用到的硬件分别有KEY。其电路在开发板上默认是已经连接好了的,所以在硬件上不需要动任何东西。其连接原理图如图下:

   

                            图2 按键部分原理图

 

2.2、软件设计

2.2.1、运行效果

分别按下四个按键,每个都会有响应,结果如下:

key 1 press

key 1 press

key 2 press

key 2 press

key 2 press

key 3 press

key 4 press

 

2.2.2、应用代码

按键测试用到的代码文件如下:

application/example/edu_demo/mfg_test/key_test.c

key_test.c完成当收到按键值时去打印相关的按键信息。其中函数key_test调用key_init去初始化了按键功能,并设置了一个回调函数key_event_handle,当有按键事件的时候,就会回调key_event_handle,然后在key_event_handle里面去显示相关的信息。

static void key_event_handle(key_code_t key_code)

{

     switch (key_code)

     {

        case EDK_KEY_1:

            printf("key 1 press\n");

            led_test_flag = 0;

            break;

        case EDK_KEY_2:

            printf("key 2 press\n");

            led_test_flag = 0;

            break;

        case EDK_KEY_3:

            printf("key 3 press\n");

            led_test_flag = 0;

            break;

        case EDK_KEY_4:

            printf("key 4 press\n");

            led_test_flag = 0;

            break;

        case EDK_KEY_1 | EDK_KEY_2:

            printf("Enter auto_factory_test mode\n");

            auto_test_flag = 1;

        break;   

     }

}



void key_test(void)

{

    key_init(key_event_handle);

}

 

2.2.3、按键检测代码

其中检测按键的代码在key.c,路径如下:

platform/board/haaseduk1/drivers/key.c

EDK中一共有四个按键。按键初始化在key_init中,这里主要是设置统一的回调函数,这个回调函数带有一个参数key_code,表示是哪个按键,或者哪几个键(组合)按下。

 

key_init对按键接的4个Pin脚进行初始化,这里通过hal_gpio_init初始化为IRQ_MODE, 也就是中断模式。通过hal_gpio_enable使能中断,中断处理函数是key_falling_edge_handle,  也就是按键没有按下时,PIN脚是高电平,按键按下时就会拉为低电平,所以按键的开始是一个下降沿,通过key_falling_edge_handle函数处理,反之松开按键触发一个上升沿,通过key_rising_edge_handle函数处理。

 

同时这里启了一个定时器,定时去执行key_poll,这个函数会poll四个按键,主要用来检测组合键的按下。

int key_init(key_code_cb key_func)

{

    int32_t ret = 0;

    uint32_t i = 0;

    printf("enter %s:%d\n", __func__,__LINE__);



    if (key_func) {

        notify_key_code_cb = key_func;

    } else {

        return -1;

    }



    for (i = 0; i < KEY_NUM; i++) {

        ret = hal_gpio_init(&key_dev_input[i].gpio_dev);

        if (ret) {

            LOGE(TAG, "di %d pin %d init fail ret", i, key_dev_input[i].gpio_dev.port, ret);

            return -1;

        }



        ret = hal_gpio_enable_irq(&key_dev_input[i].gpio_dev, IRQ_TRIGGER_FALLING_EDGE,

                            key_falling_edge_handle, &key_dev_input[i].gpio_dev);

        if (ret) {

            LOGE(TAG, "di %d pin %d fail enable irq ret %d", i, key_dev_input[i].gpio_dev.port, ret);

            return -1;

        }

        key_dev_input[i].installed = 1;

    }



        /*init the gpio check timer, check gpio value every 30ms */

    ret = aos_timer_new_ext(&key_poll_timer, key_poll, NULL, TIMER_CHECK_INTERVAL, 1, 1);

    if (ret) {

        LOGE(TAG, "Fail to new gpio value check timer ret 0x%x", ret);

        for (i = 0; i < KEY_NUM; i++) {

            hal_gpio_disable_irq(&key_dev_input[i].gpio_dev);

            hal_gpio_finalize(&key_dev_input[i].gpio_dev);

            key_dev_input[i].installed = 0;

        }

        return -1;

    }



    return 0;

}

 

2.3、编译与下载

2.3.1、代码准备

打开edu_demo的产测开关

application/example/edu_demo/Config.in

在该文件中修改编译选项,打开EDK_DEMO_FACTORY_TEST_ENABLIE开关。

config EDK_DEMO_FACTORY_TEST_ENABLIE

    bool "enable factory test function"

    default y

 

加入Demo到启动代码

application/example/edu_demo/app_entry.c

函数application_start中注释掉menu_init();,添加key_test();

        //menu_init();

        key_test();

2.3.2、编译

命令行方式进行编译

aos make distclean

aos make edu_demo@haaseduk1 -c config

aos make

 

2.3.3、烧录

  • 命令行方式
aos upload
  • 图形界面方式

详见haaS EDU K1 快速开始 第4.3.3章节-使用GUI工具烧录部分。

 

开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/

猜你喜欢

转载自blog.csdn.net/HaaSTech/article/details/114581085