GPIO 中断API介绍
wifiiot_gpio.h中包含声明GPIO中断相关函数
- 设置GPIO引脚中断功能
unsigned int GpioRegisterIsrFunc(WifiIotGpioIdx id, WifiIotGpioIntType intType, WifiIotGpioIntPolarity intPolarity, GpioIsrCallbackFunc func, char *arg); - 取消GPIO引脚中断功能
unsigned int GpioUnregisterIsrFunc(WifiIotGpioIdx id); - 屏蔽GPIO引脚中断功能
unsigned int GpioSetIsrMask(WifiIotGpioIdx id, unsigned char mask); - 设置GPIO引脚中断触发模式
unsigned int GpioSetIsrMode(WifiIotGpioIdx id, WifiIotGpioIntType intType, WifiIotGpioIntPolarity intPolarity);
初时化LED灯及按键
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include <string.h>
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
static void key1_func(char *p)
{
printf("key1_func cnt %s\n",p);
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_VALUE0);
}
static void key2_func(char *p)
{
printf("key2_func cnt %s\n",p);
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_VALUE1);
}
static void my_led_example(void)
{
GpioInit();
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_DIR_OUT);
static char buf1[] = "key1";
static char buf2[] = "key2";
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_IO_PULL_UP);
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,key1_func,
buf1);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_IO_PULL_UP);
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,key2_func,
buf2);
}
SYS_RUN(my_led_example);
- 运行效果
- 按键有抖动,按一次会触发多次,这是不想要的结果,需要进行去抖处理,这里使用定时器对按键1短按键去抖
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include <string.h>
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
osTimerId_t id;
static void key1_func(char *p)
{
(void)p;
WifiIotGpioValue val;
GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_11,&val);
if(WIFI_IOT_GPIO_VALUE0 == val)
{
if(id != NULL)
{
osTimerStart(id,1);
}
GpioSetIsrMode(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH);
}
else
{
if(id != NULL)
{
osTimerStop(id);
}
GpioSetIsrMode(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH);
}
}
static void key2_func(char *p)
{
printf("key2_func cnt %s\n",p);
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_VALUE1);
}
static void timer1_handler(void *p)
{
(void)p;
WifiIotGpioValue val;
GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_11,&val);
if(WIFI_IOT_GPIO_VALUE0 == val)
{
printf("key1_func cnt\n");
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_VALUE0);
}
else
{
GpioSetIsrMode(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW);
}
}
static void my_led_example(void)
{
GpioInit();
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_DIR_OUT);
id = osTimerNew(timer1_handler,osTimerOnce,"timer1",NULL);
static char buf1[] = "key1";
static char buf2[] = "key2";
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_IO_PULL_UP);
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,key1_func,
buf1);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_IO_PULL_UP);
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,key2_func,
buf2);
}
SYS_RUN(my_led_example);
- 运行效果图,key1按键按一次只处理一次,key2键没有去抖还会触发多次
|