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