LiteOS GPIO操作

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

​
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值