Bearpi开发板HarmonyOS之GPIO中断
中断 开发板 HarmonyOS GPIO
2023-09-14 09:06:41 时间
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)
{
// LED灯引脚配置成输出
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);
// 按键KEY1,KEY2配置成IO中断,下降沿触发
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); // 0.01s
}
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); // 0.01s
}
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)
{
// LED灯引脚配置成输出
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);
// 按键KEY1,KEY2配置成IO中断,下降沿触发
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键没有去抖还会触发多次
相关文章
- 小内核操作系统中中断和任务之间的信号
- [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
- 【STM32F429】第11章 ThreadX中断优先级配置,含BasePri配置方案
- 如何处理TCPSocket客户端与服务器端连接中断后的异常
- 单片机设计定时器中断服务程序
- 鸿蒙轻内核M核源码分析:中断Hwi
- FreeRTOS 中断配置 临界段 Cortex-M 中断 中断配置宏 开关中断 临界段代码 中断屏蔽的特殊寄存器 任务级临界段代码保护 中断级临界段代码保护 BASEPRI 寄存器
- 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
- 我们该如何正确的中断一个线程的执行??
- LabVIEW用VISA Read函数来读取USB中断数据
- linux中断处理流程总结
- 中断、轮询、事件驱动、消息驱动、数据流驱动(Flow-Driven)?
- STM32-嵌入式学习笔记02-中断应用概述
- STM32F1小系统调试案例——串口采用HAL库中断方式接收,只能收到第一批数据
- 按键消抖的两种方法--中断延迟工作与定时器