跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
viking代理捷比信 · 专业器件主题站

基于宏梦OS的按键驱动

键是常用的输入系统。如何准确有效地获取关键值是一个经常面临的问题。今天我们来看看如何在宏梦系统中获得独立键的键值。为了实现这一目标,我们以Hi3861核心板左下角的USER按钮S2为例。当按下按钮时,信息通过与USBType-c相对应的串行端口输出。下图中的黄线显示了真实对象中按钮S2的对应关系:按钮原理图核心板左下角的按钮S2原理图如下:当按下S2时,GPIO05为连接到GND,此时GPIO05输入为低电平。代码实施方法1:读取输入IO状态#include#include#include“ ohos_init.h” #include“ cmsis_os2.h” #include“ wifiiot_gpio.h”“#include” wifiiot_gpio_ex.h“ #include” wifiiot_errno.h“静态关键字” (constchar * arg){(void)arg; printf(" EntertheKey_Task ...

"); while(1){WifiIotGpioValuewigv; GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5,& wigv); if(wigv == WIFI_IOT_GPIO_VALUE0){usleep(10 * 1000); // 10mswhile(1){GpioGetInputVal(WIFI_IOT_IO,wig = vGPIO)_5 = WIFI_IOT_GPIO_VALUE1){printf(“ [DEMO] GPIO05Lowlevel。

"); break;}}}}返回;} staticvoidKeyExampleEntry(void){unsignedintret = 0; GpioInit(); IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5,WIFI_IOT_IO_FUNC_GPIO_5_GPIO); GpioSetDir(WIFI_TIOT_GPIO_IDX _ == 5; WIFI_IOT = IO = ==== gpio-> GpioSetDirret:%d

",ret); return;} osThreadAttr_tattr = {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("失败createKey_Task!

");}} SYS_RUN(KeyExampleEntry);编译代码:pythonbuild.pywifiiot更新固件后重启最小系统板,打开串口助手,单击核心板上的USER按钮S2,串口助手输出信息如下:注意:本示例创建一个新的一个任务用于循环读取按钮的状态。作为应用程序的输入功能,KeyExampleEntry不能任意使用while(1)的耗时操作。它必须快速返回,否则会阻碍红萌OS中其他应用程序的运行。因此,在此输入功能中创建用于监视按钮状态的专用任务(线程),以确定按钮的状态。 GPIO中断从上面的示意图中我们可以看到,当不按下按钮S2时,GPIO05为默认的高电平;当按下按钮S2时,GPIO05被连接至GND,当按钮S2被按下时,GPIO05被拉低。释放后,GPIO05返回高电平。在此过程中,当按下按钮S2时,GPIO05将接收一个从高到低的电平变化,我们称此过程为下降沿;释放按钮S2时,GPIO05将从低电平变为高电平,我们将此过程称为上升沿。如上所述,在不考虑抖动的影响的情况下,每次按下按钮时,GPIO05都会接收到下降沿。释放按钮时,GPIO05将接收上升沿。我们在GPIO05引脚上边沿触发功能(上升沿或下降沿触发)上注册一个,然后调用此已注册的边沿触发回调函数一次,理论上有按键动作。 #include#include#include“ ohos_init.h” #include cmsis_os2.h“ #include” wifiiot_gpio.h”“#include” wifiiot_gpio_ex.h” /“#include” wifiiot_errno.h” / * gpiocallbackfunc * / voidgpio5_isr_func(char * arg){(void)arg ---- -gpio05isrsuccess -----

&QUOT);} staticvoidKeyExampleEntry(无效){unsignedintret = 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_IDX_5,WIFI_IOT_GPIO_IDX_5,WIFI_IOT_GPIO_IDX_5,WIFI_IOT_GPIO_IDX_5,WIFI_IOT_GPIO_ID /" ===== ERROR === === gpio-> GpioSetDirret:%d

",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 ====>(" p!

" ret);}} SYS_RUN(KeyExampleEntry);代码说明:WIFI_IOT_IO_NAME_GPIO_5是连接到按钮S2的GPIO。要实现键中断捕获,您需要使用IoSetFunc()函数来重新定义端口函数。调用GpioSetDir()函数将GPIO05设置为输入,并且通过IoSetPull()函数将端口设置为上拉输入(PullUp);调用GpioRegisterIsrFunc()函数完成GPIO05的注册绑定和回调函数gpio5_isr_func(),将触发模式设置为上升沿触发:WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,当按钮S2出现时