OpenHarmony API-IoSetFunc() 设置GPIO引脚功能

介绍

设置GPIO引脚功能

头文件

\\base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_gpio_ex.h

定义

unsigned int IoSetFunc(WifiIotIoName id, unsigned char val);
参数
  1. id:表示GPIO引脚号
    需配置的物理引脚标识,必须是 WifiIotIoName 枚举值,详见链接,例如:

    • WIFI_IOT_IO_NAME_GPIO_9:表示物理上的第 9 号 GPIO 引脚;
    • 该参数明确“要配置哪个物理引脚”。
  2. val:表示IO复用功能
    引脚要切换到的工作模式,必须是该引脚支持的 WifiIotIoFunc 枚举值,例如,GPIO_9引脚可设置如模式(详见链接):

    • 通用 GPIO 模式:WIFI_IOT_IO_FUNC_GPIO_9_GPIO;
    • I2C 时钟线模式:WIFI_IOT_IO_FUNC_GPIO_9_I2C0_SCL;
    • PWM 输出模式:WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT;

说明

在 OpenHarmony 物联网设备开发(如 Hi3861、Hi3516 等平台)中,IoSetFunc() 是 GPIO 引脚功能配置的核心函数,其核心作用是为芯片的物理引脚指定工作模式(如通用 GPIO、I2C、UART、PWM 等),是实现引脚“功能复用”的关键操作。

作用:实现引脚功能复用

芯片的物理引脚数量有限,但需支持多种外设接口(如 I2C、UART、SPI 等),因此采用“功能复用”设计——同一引脚可通过 IoSetFunc() 配置为不同功能。
例如,GPIO9 引脚可通过该函数切换:

  • 配置为 WIFI_IOT_IO_FUNC_GPIO_9_GPIO → 作为通用 GPIO 控制 LED;
  • 配置为 WIFI_IOT_IO_FUNC_GPIO_9_I2C0_SCL → 作为 I2C 总线的时钟线连接传感器;
  • 配置为 WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT → 输出 PWM 信号调节电机转速。

典型使用流程(以 GPIO 功能为例)

IoSetFunc() 是 GPIO 操作的第一步(必须先配置功能,再设置方向/电平),完整流程如下:

示例:将 GPIO9 配置为通用 GPIO 并控制 LED

#include "wifiiot_gpio.h"
#include "gpio_if.h"
#include "ohos_init.h"
#include "unistd.h"

// 功能初始化:配置GPIO9为通用GPIO
void LedInit(void) {
    unsigned int ret;
    // 1. 配置GPIO9的功能为通用GPIO
    ret = IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
    if (ret != 0) {
        printf("GPIO9功能配置失败,错误码:%d\n", ret);
        return;
    }
    // 2. (功能配置成功后)设置GPIO9为输出模式
    GpioSetDir(WIFI_IOT_GPIO_IDX_9, WIFI_IOT_GPIO_DIR_OUT);
    printf("GPIO9初始化完成(通用GPIO输出模式)\n");
}

// 主逻辑:控制LED闪烁
void BlinkLed(void) {
    while (1) {
        // 输出高电平(点亮LED)
        GpioSetOutputVal(WIFI_IOT_GPIO_IDX_9, 1);
        usleep(500000);  // 延时0.5秒
        // 输出低电平(熄灭LED)
        GpioSetOutputVal(WIFI_IOT_GPIO_IDX_9, 0);
        usleep(500000);
    }
}

// 先初始化模块,再启动主逻辑
APP_FEATURE_INIT(LedInit);  // 用APP_FEATURE_INIT注册初始化函数(先执行)
SYS_RUN(BlinkLed);          // 用SYS_RUN注册主逻辑(后执行)

注意事项

  1. 功能与引脚匹配
    每个引脚支持的功能是固定的(由芯片硬件设计决定),不可随意配置不支持的功能。例如,若 GPIO9 不支持 UART 功能,配置 WIFI_IOT_IO_FUNC_GPIO_9_UART2_RTS_N 会返回失败。
    可在 wifiiot_gpio.h 头文件中查看某引脚支持的所有功能枚举。

  2. 功能排他性
    同一引脚同一时刻只能配置一种功能。例如,配置为 I2C0_SCL 后,无法同时作为 PWM 输出,需重新调用 IoSetFunc() 切换功能。

  3. 执行时机
    需在系统初始化阶段(如 APP_FEATURE_INIT() 注册的函数中)调用,确保引脚在被使用前完成功能配置。

  4. 返回值检查
    建议检查函数返回值,若配置失败(如引脚号错误、功能不支持),可及时定位问题。

与其他 GPIO 函数的关系

IoSetFunc() 是 GPIO 操作的“基础”,与其他函数的依赖关系如下:

graph LR
A[IoSetFunc() 配置引脚功能为通用GPIO] --> B[GpioSetDir() 设置GPIO方向(输入/输出)]
B --> C[GpioSetOutputVal() 控制输出电平]
B --> D[GpioGetInputVal() 读取输入电平]

简言之:先通过 IoSetFunc() 确定引脚“做什么”,再通过其他函数控制引脚“怎么用”。

总结

IoSetFunc() 是 OpenHarmony 中连接“物理引脚”与“软件功能”的核心桥梁,通过它实现引脚的功能复用,是所有 GPIO 及外设接口(I2C、UART 等)开发的第一步。理解其用法和参数匹配规则,是正确操作硬件引脚的基础。


原文出处:/show_1GW1wHTm3p6I.html