介绍
设置GPIO引脚功能
头文件
\\base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_gpio_ex.h
定义
unsigned int IoSetFunc(WifiIotIoName id, unsigned char val);
参数
id:表示GPIO引脚号
需配置的物理引脚标识,必须是WifiIotIoName枚举值,详见链接,例如:WIFI_IOT_IO_NAME_GPIO_9:表示物理上的第 9 号 GPIO 引脚;- 该参数明确“要配置哪个物理引脚”。
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;
- 通用 GPIO 模式:
说明
在 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注册主逻辑(后执行)
注意事项
功能与引脚匹配
每个引脚支持的功能是固定的(由芯片硬件设计决定),不可随意配置不支持的功能。例如,若 GPIO9 不支持 UART 功能,配置WIFI_IOT_IO_FUNC_GPIO_9_UART2_RTS_N会返回失败。
可在wifiiot_gpio.h头文件中查看某引脚支持的所有功能枚举。功能排他性
同一引脚同一时刻只能配置一种功能。例如,配置为 I2C0_SCL 后,无法同时作为 PWM 输出,需重新调用IoSetFunc()切换功能。执行时机
需在系统初始化阶段(如APP_FEATURE_INIT()注册的函数中)调用,确保引脚在被使用前完成功能配置。返回值检查
建议检查函数返回值,若配置失败(如引脚号错误、功能不支持),可及时定位问题。
与其他 GPIO 函数的关系
IoSetFunc() 是 GPIO 操作的“基础”,与其他函数的依赖关系如下:
graph LR
A[IoSetFunc() 配置引脚功能为通用GPIO] --> B[GpioSetDir() 设置GPIO方向(输入/输出)]
B --> C[GpioSetOutputVal() 控制输出电平]
B --> D[GpioGetInputVal() 读取输入电平]
简言之:先通过 IoSetFunc() 确定引脚“做什么”,再通过其他函数控制引脚“怎么用”。
总结
IoSetFunc() 是 OpenHarmony 中连接“物理引脚”与“软件功能”的核心桥梁,通过它实现引脚的功能复用,是所有 GPIO 及外设接口(I2C、UART 等)开发的第一步。理解其用法和参数匹配规则,是正确操作硬件引脚的基础。