电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
基于鸿蒙OS的按键驱动
分 享
扫描二维码分享
基于鸿蒙OS的按键驱动
鸿蒙OS
LIteOS
按键驱动
嵌入式从0到1
关注
发布时间: 2020-11-09
丨
阅读: 3457
按键作为常用的输入系统,如何准确并高效的获取按键值,是一个经常要面对的问题,今天我们看看在鸿蒙系统中,如何得到独立按键的按键值。 ### 实现目标 我们这次以Hi3861核心板左下角的USER按键S2为例,当按键按下时,通过USB Type-c对应的串口输出信息。 按键S2在实物中的对应关系如下图黄线所示: ![](http://www.xiaohage.com/wp-content/uploads/2020/11/17533_1-1024x660.png) ### 按键原理图 核心板左下角的按键S2的原理图如下: ![](http://www.xiaohage.com/wp-content/uploads/2020/11/17511_1.png) 当S2被按下之后,GPIO05与GND相连,此时GPIO05输入为低电平。 ### 代码实现 #### 实现方式一:读取输入IO的状态 ```C #include
#include
#include "ohos_init.h" #include "cmsis_os2.h" #include "wifiiot_gpio.h" #include "wifiiot_gpio_ex.h" #include "wifiiot_errno.h" static void Key_Task(const char* arg) { (void)arg; printf("Enter the Key_Task ... \n"); while (1) { WifiIotGpioValue wigv; GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5,&wigv); if (wigv == WIFI_IOT_GPIO_VALUE0) { usleep(10*1000); //10ms while(1) { GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5,&wigv); if (wigv == WIFI_IOT_GPIO_VALUE1){ printf("[DEMO] GPIO05 Low level.\n"); break; } } } } return; } static void KeyExampleEntry(void) { unsigned int ret = 0; GpioInit(); IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO); GpioSetDir(WIFI_IOT_GPIO_IDX_5, WIFI_IOT_GPIO_DIR_IN); if (ret != WIFI_IOT_SUCCESS) { printf("=====ERROR======gpio -> GpioSetDir ret:%d\r\n", ret); return; } osThreadAttr_t attr = {0}; attr.name = "Key_Task"; attr.attr_bits = 0U; attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = 1024; attr.priority = osPriorityNormal; if(osThreadNew((osThreadFunc_t)Key_Task,NULL,&attr) == NULL) { printf("Failed to create Key_Task !\n"); } } SYS_RUN(KeyExampleEntry); ``` 编译代码: ``` python build.py wifiiot ``` ![](http://www.xiaohage.com/wp-content/uploads/2020/11/17514_1.png) 更新固件之后重启最小系统板,打开串口助手,点击核心板上的USER按键S2,串口助手输出信息如下: ![](http://www.xiaohage.com/wp-content/uploads/2020/11/17548_0.png) **注意:** 此实例新建了一个任务用于循环读取按键的状态,KeyExampleEntry作为应用程序的入口函数,不能随意使用while(1)这种耗时的操作,必须快速返回,否则会妨碍鸿蒙OS中其他应用程序的运行,因此,在这个入口函数中创建一个按键状态监测的专属任务(线程)用于判断按键的状态。 #### GPIO中断 通过上面的原理图我们可知,当按键S2没有被按下的时候,GPIO05为默认状态高电平,当按键S2被按下时,GPIO05与GND相连,GPIO05被拉低,当松开按键S2的时候,GPIO05又恢复高电平。 在此过程中,当按键S2被按下时,GPIO05会收到一个由高到低的电平变化,我们称这个过程为下降沿;当按键S2被松开时,GPIO05会收到一个由低到高的电平变化,我们称这个过程为上升沿。 综上所述,在不考虑抖动影响的前提下,每次按键被按下,GPIO05将会收到一个下降沿;按键被释放,GPIO05会收到一个上升沿。 我们在GPIO05这个引脚上注册一个边沿触发函数(上升沿或者下降沿触发都可以),那么这个注册的边沿触发回调函数被调用一次,理论上就是有一次按键的动作发生。 ```C #include
#include
#include "ohos_init.h" #include "cmsis_os2.h" #include "wifiiot_gpio.h" #include "wifiiot_gpio_ex.h" #include "wifiiot_errno.h" /@@* gpio callback func */ void gpio5_isr_func(char *arg) { (void)arg; printf("----- gpio05 isr success -----\r\n"); } static void KeyExampleEntry(void) { unsigned int ret = 0; GpioInit(); IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO); GpioSetDir(WIFI_IOT_GPIO_IDX_5, WIFI_IOT_GPIO_DIR_IN); //IoSetPull(WIFI_IOT_GPIO_IDX_5,WIFI_IOT_IO_PULL_UP); if (ret != WIFI_IOT_SUCCESS) { printf("===== ERROR ======gpio -> GpioSetDir ret:%d\r\n", ret); return; } ret = GpioRegisterIsrFunc(WIFI_IOT_GPIO_IDX_5,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH, gpio5_isr_func, NULL); if (ret != WIFI_IOT_SUCCESS) { printf("===== ERROR ======gpio -> hi_gpio_register_isr_function ret:%d\r\n", ret); } } SYS_RUN(KeyExampleEntry); ``` #### 代码说明: 1. WIFI_IOT_IO_NAME_GPIO_5是与按键S2相连的GPIO,要实现按键中断捕获,需要先使用IoSetFunc() 函数进行端口功能重定义; 2. 调用GpioSetDir()函数,设置GPIO05为输入,并通过IoSetPull() 函数将端口设置为上拉输入(Pull Up); 3. 调用GpioRegisterIsrFunc()函数,完成GPIO05和回调函数gpio5_isr_func()的注册绑定,设置触发模式为上升沿触发:WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,当按键S2被抬起的时候,产生上升沿,触发回调函数gpio5_isr_func()工作。 ![](http://www.xiaohage.com/wp-content/uploads/2020/11/17530_1.png) 通过上面两种方式,我们学会了独立按键状态的获取、鸿蒙系统中如何创建任务和外部中断的使用,利用此代码,我们还可以用于识别热释红外传感器的响应信号。 ### 资料获取 公众号**留言区置顶留言**获取本文相关代码。 ps: 文章首发于电子发烧友。 ### 小哈有话说 最近在鸿蒙交流群中看到下面一大批开发板要移植鸿蒙操作系统了,等到这些厂商将板卡移植好了,那么鸿蒙就真的成气候了,作为一个嵌入式开发者,学习一个实时操作系统是必不可少的,学什么都是学,为什么不学一个有前途的呢? ![](http://www.xiaohage.com/wp-content/uploads/2020/11/17532_1.png) ### 欢迎关注 程序员小哈带你玩转嵌入式,微信搜索:**嵌入式从0到1**,更多干货等着你。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式从0到1
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交