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/