在LiteOS系统里主要使用IoTGpioRegisterIsrFunc函数注册GPIO的中断:
函数原型:
unsigned int IoTGpioRegisterIsrFunc(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity, GpioIsrCallbackFunc func, char *arg)参数功能:
id参数指定IO口, intType指定中断触发方式(LEVEL高/低电平时中断,EDGE上升/下降边沿时中断)
intPolarity指定IO口什么电平状态时触发中断, 双边沿:IOT_GPIO_EDGE_FALL_LEVEL_LOW|IOT_GPIO_EDGE_RISE_LEVEL_HIGH
func参数指定中断处理函数, arg参数指定中断处理函数执行传递的参数
按键1GPIO的中断处理:
#include <stdio.h>
#include <ohos_init.h>
#include <hi_io.h>
#include <iot_gpio.h>
#include <iot_errno.h>
#include <unistd.h>
#include <cmsis_os2.h>#define KEY_IO HI_IO_NAME_GPIO_11
#define KEY_FUNC HI_IO_FUNC_GPIO_11_GPIOvoid key_isr(void *arg)
{//获取按键IO口的电平来判断是按下还是松手int v;IoTGpioGetInputVal(KEY_IO, &v);if (v)printf("key up\n");elseprintf("key down\n");
}void myhello_test()
{IoTGpioInit(KEY_IO);hi_io_set_func(KEY_IO, KEY_FUNC);hi_io_set_pull(KEY_IO, HI_IO_PULL_UP);hi_io_set_schmitt(KEY_IO, HI_TRUE);//打开硬件消抖功能IoTGpioSetDir(KEY_IO, IOT_GPIO_DIR_IN);IoTGpioRegisterIsrFunc(KEY_IO, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW|IOT_GPIO_EDGE_RISE_LEVEL_HIGH, key_isr, NULL);}SYS_RUN(myhello_test);
这里比较奇怪,小熊派开发有些工作正常,有些只能获取松手时的上升沿中断。