【Alios-things笔记】EMW3060 GPIO按键功能实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oxp7085915/article/details/83686020

EMW3060引脚映射

  • EMW3060模块封装定义:
    在这里插入图片描述

  • EMW3060 引脚定义
    在这里插入图片描述
    在这里插入图片描述

  • 代码中的映射关系
    aliso-things/platform/mcu/moc108/hal/gpio.c

    static const uint8_t gpio_map[] =
    {
        [1] = 30,
        [2] = 29,
        [3] = 17,
        [4] = 16,
        [5] = 14,
        [6] = 15,
        [7] = 0,
        [8] = 1,
        [11] = 20,
        [12] = 4,
        [17] = 23,
        [18] = 22,
        [19] = 11,
        [20] = 10,
        [21] = 21,
    };

右边的数字对于GPIO引脚号。

EMW3060 GPIO按键实现

在alios-things/board/mk3060/目录下创建key.c文件,并输入如下内容(这里使用ELINK按键实现加网操作)

#include "hal/soc/soc.h"
#include <aos/kernel.h>
#include <aos/aos.h>

//GPIO29
#define KEY_ELINK  2

static uint64_t   elink_time = 0;
static gpio_dev_t gpio_key_elink;

static void key_poll_func(void *arg)
{
    uint32_t level;
    uint64_t diff;

    hal_gpio_input_get(&gpio_key_elink, &level);

    if (level == 0) {
        aos_post_delayed_action(10, key_poll_func, NULL);
    } else {
        diff = aos_now_ms() - elink_time;
        if (diff > 6000) { /*long long press */
            elink_time = 0;
            aos_post_event(EV_KEY, CODE_BOOT, VALUE_KEY_LLTCLICK);
        } else if (diff > 2000) { /* long press */
            elink_time = 0;
            aos_post_event(EV_KEY, CODE_BOOT, VALUE_KEY_LTCLICK);
        } else if (diff > 40) { /* short press */
            elink_time = 0;
            aos_post_event(EV_KEY, CODE_BOOT, VALUE_KEY_CLICK);
        } else {
            aos_post_delayed_action(10, key_poll_func, NULL);
        }
    }
}

static void key_proc_work(void *arg)
{
    aos_schedule_call(key_poll_func, NULL);
}

static void handle_elink_key(void *arg)
{
    uint32_t gpio_value;

    hal_gpio_input_get(&gpio_key_elink, &gpio_value);
    if (gpio_value == 0 && elink_time == 0) {
        elink_time = aos_now_ms();
        aos_loop_schedule_work(0, key_proc_work, NULL, NULL, NULL);
    }
}

void key_init(void)
{
    gpio_key_elink.port = KEY_ELINK;
    gpio_key_elink.config = IRQ_MODE;
    hal_gpio_init(&gpio_key_elink);

    hal_gpio_enable_irq(&gpio_key_elink, IRQ_TRIGGER_FALLING_EDGE, handle_elink_key, NULL);
}

接着修改alios-things/board/mk3060/mk3060.mk文件,将key.c加入到编译对象中

... ...
#在这里加入key.c文件
$(NAME)_SOURCES := board.c  key.c
... ...

在alios-things/platform/mcu/moc108/aos/aos_main.c中调用按键初始化函数key_init,完成配置。

.... ....
extern void key_init(void);

static void sys_init(void)
{
  .... ....
    key_init();
  .... ....
}

void sys_start(void)
{
    aos_init();
    soc_driver_init();
    krhino_task_dyn_create(&g_aos_init, "aos-init", 0, AOS_DEFAULT_APP_PRI, 0, AOS_START_STACK, sys_init, 1);
    aos_start();
}

没有更多推荐了,返回首页