【Alios-things筆記】EMW3060 GPIO按鍵功能實現

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();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章