在源码工程中, 华为海思在hi_io.h头文件里已定义好表示每个IO口的宏定义,如:
typedef enum {HI_IO_NAME_GPIO_0, /**< GPIO0 */HI_IO_NAME_GPIO_1, /**< GPIO1 */HI_IO_NAME_GPIO_2, /**< GPIO2 */...
}
并且在此头文件中,也定义好每个IO口功能的宏定义,如GPIO_03的功能:
typedef enum {HI_IO_FUNC_GPIO_3_GPIO,HI_IO_FUNC_GPIO_3_UART0_TXD,HI_IO_FUNC_GPIO_3_UART1_CTS_N,HI_IO_FUNC_GPIO_3_SPI1_CSN,HI_IO_FUNC_GPIO_3_JTAG_TDI,HI_IO_FUNC_GPIO_3_PWM5_OUT,HI_IO_FUNC_GPIO_3_I2C1_SDA,HI_IO_FUNC_GPIO_3_SSI_DATA,
} hi_io_func_gpio_3;
IO口的操作函数,海思则在hi_gpio.h中已声明,并已实现功能。常用的操作函数有:
//初始化IO口hi_gpio_init();//设置LED的IO作为普通IO口功能(输入/输出)hi_io_set_func(HI_IO_NAME_GPIO_2, HI_IO_FUNC_GPIO_2_GPIO);//配置IO口的上拉,让IO口默认处于高电平hi_io_set_pull(HI_IO_NAME_GPIO_2, HI_IO_PULL_UP);//设置输入/输出功能hi_gpio_set_dir(HI_IO_NAME_GPIO_2, HI_GPIO_DIR_OUT); //输入hi_gpio_set_dir(HI_IO_NAME_GPIO_2, HI_GPIO_DIR_OUT); //输出//设置输出1高/0低电平 hi_gpio_set_ouput_val(HI_IO_NAME_GPIO_2, 1); //高电平hi_gpio_set_ouput_val(HI_IO_NAME_GPIO_2, 1); //低电平//获取IO口的电平int v; hi_gpio_get_ouput_val(HI_IO_NAME_GPIO_2, &v); //获取IO口输出的电平hi_gpio_get_input_val(HI_IO_NAME_GPIO_2, &v); //获取IO口输入的电平
在鸿蒙系统里,为了提高代码的通用性,在iot_gpio.h中提供了一套基于芯片厂家的IO口操作函数上封装出来的IoTGpioxx套壳函数:
//申请使用GPIO
unsigned int IoTGpioInit(unsigned int id)标注使用一个IO口,id指定要申请使用的IO口。申请成功返回IOT_SUCCESS
申请失败返回IOT_FAILURE。每个IO口只能申请一次,确保一个IO口不会重复使用。//设置IO口输入或输出IoTGpioSetDir(HI_IO_NAME_GPIO_11, IOT_GPIO_DIR_IN);IoTGpioSetDir(HI_IO_NAME_GPIO_11, IOT_GPIO_DIR_OUT);//配置GPIO输出电平
IoTGpioGetOutputVal(HI_IO_NAME_GPIO_11, 1);//输出高电平//获取GPIO电平
int v;
IoTGpioGetInputVal(HI_IO_NAME_GPIO_11, &v);//获取输入电平
通过开发板上的按键控制LED的案例代码:
#include <stdio.h>
#include <ohos_init.h> //必须包含此头文件,否则无法调试输出
#include <hi_io.h> //在此头文件中,厂家已定义好描述每个IO口功能的宏定义
#include <hi_gpio.h> //此头文件描述IO口的操作函数
#include <unistd.h> // 里面提供延时函数
#include <iot_gpio.h> //鸿蒙系统通用的GPIO操作函数
#include <iot_errno.h> // 提供IOT_SUCCESS宏定义//按键控制LED灯// KEY1 --> GPIO_11
// KEY2 --> GPIO_12
// LED --> GPIO_02#define KEY_IO HI_IO_NAME_GPIO_12
#define KEY_FUNC HI_IO_FUNC_GPIO_12_GPIO
#define LED_IO HI_IO_NAME_GPIO_2
#define LED_FUNC HI_IO_FUNC_GPIO_2_GPIOvoid myhello_init() //自定义一个入口函数
{printf("myhello init\n"); if (IOT_SUCCESS != IoTGpioInit(KEY_IO)){printf("key1 io init failed\n");return;}hi_io_set_func(KEY_IO,KEY_FUNC);//配置IO口的上拉,让IO口默认处于高电平hi_io_set_pull(KEY_IO, HI_IO_PULL_UP);IoTGpioSetDir(KEY_IO, IOT_GPIO_DIR_IN);//LED灯IO口初始化IoTGpioInit(LED_IO);hi_io_set_func(LED_IO, LED_FUNC);IoTGpioSetDir(LED_IO, IOT_GPIO_DIR_OUT);//函数参数类型为指针变量时,则表示需要传变量的地址.int v, n = 0;while (1){IoTGpioGetInputVal(KEY_IO, &v);if (!v){//按键按下,LED灯状态翻转IoTGpioGetOutputVal(LED_IO, &v);//获取LED灯IO口的电平IoTGpioSetOutputVal(LED_IO, !v);//设置相反电平printf("key pressed %d\n", n++);//消抖, 循环直到松手为止while (1){IoTGpioGetInputVal(KEY_IO, &v);if (v)break;usleep(1000);}}usleep(100000);}
}//声明myhello_init为入口函数
SYS_RUN(myhello_init); //在鸿蒙系统层自动执行入口函数
// APP_FEATURE_INIT(myhello_init); //在鸿蒙系统的应用层自动执行入口函数