在源码工程中, 华为海思在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_GPIO
void 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); //在鸿蒙系统的应用层自动执行入口函数