目标:掌握 OpenHarmony 轻量系统的 GPIO 接口,实现 LED 硬件控制
前置条件:已完成 Day 9 的消息队列教程


一、工程结构

app/
├── BUILD.gn
└── 09_gpio/                      # 模块目录
    ├── BUILD.gn
    └── demo.c                    # GPIO 测试代码

1.1 app/BUILD.gn

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
  features = [
    "09_gpio:gpio_demo",           # 引用 09_gpio 模块
  ]
}

1.2 09_gpio/BUILD.gn

static_library("gpio_demo") {
    sources = [
        "demo.c"
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/peripheral/interfaces/kits",  # GPIO 头文件路径
    ]
}

二、完整代码详解

2.1 头文件

#include <stdio.h>
#include <unistd.h>
#include "cmsis_os2.h"      # CMSIS-RTOS2 接口
#include "ohos_init.h"      # OpenHarmony 系统初始化
#include "iot_gpio.h"       # OpenHarmony GPIO 硬件接口

iot_gpio.h 是 OpenHarmony 统一硬件接口(IoT 子系统),封装了不同芯片的 GPIO 差异。

2.2 宏定义

#define LED_TASK_GPIO       (9)         # LED 连接的 GPIO 引脚号
#define LED_TASK_STACK_SIZE (1024)      # 线程栈大小
#define LED_TASK_PRIO       (25)        # 线程优先级
#define DELAY_TICKS_50      (50)        # 50 tick 延时(约 50ms)
#define GPIO_HIGH           (1)         # 高电平
#define GPIO_LOW            (0)         # 低电平

Hi3861 开发板 GPIO 9

  • 通常连接板载 LED(具体看开发板原理图)
  • 部分开发板 LED 为低电平点亮,部分为高电平点亮

2.3 GPIO 任务线程

static void* GpioTask(void)
{
    static int count = 100;             # 闪烁 100 次

    # 1. 初始化 GPIO
    IoTGpioInit(LED_TASK_GPIO);

    # 2. 设置 GPIO 方向为输出
    IoTGpioSetDir(LED_TASK_GPIO, IOT_GPIO_DIR_OUT);

    while (count--) {
        printf(" LED_SPARK!\n");

        # 3. 点亮 LED(低电平)
        IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_LOW);
        osDelay(DELAY_TICKS_50);        # 延时 50ms

        # 4. 熄灭 LED(高电平)
        IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_HIGH);
        osDelay(DELAY_TICKS_50);        # 延时 50ms
    }

    return NULL;
}

GPIO 操作流程

初始化 → 设置方向 → 循环[输出低/高电平 + 延时]

2.4 系统入口

static void GpioExampleEntry(void)
{
    osThreadAttr_t attr = {
        .name = "GpioTask",
        .attr_bits = 0U,
        .cb_mem = NULL,
        .cb_size = 0U,
        .stack_mem = NULL,
        .stack_size = LED_TASK_STACK_SIZE,
        .priority = LED_TASK_PRIO,
    };

    if (osThreadNew((osThreadFunc_t)GpioTask, NULL, &attr) == NULL) {
        printf("[GpioExample] Failed to create GpioTask!\n");
    }
}

SYS_RUN(GpioExampleEntry);

三、GPIO API 详解

3.1 IoTGpioInit — 初始化 GPIO

unsigned int IoTGpioInit(unsigned int gpio);
参数 说明
gpio GPIO 引脚号

功能:初始化指定 GPIO,配置时钟、复用功能等。

3.2 IoTGpioSetDir — 设置方向

unsigned int IoTGpioSetDir(unsigned int gpio, IotGpioDir dir);
参数 说明
gpio GPIO 引脚号
dir 方向:IOT_GPIO_DIR_IN(输入)/ IOT_GPIO_DIR_OUT(输出)

3.3 IoTGpioSetOutputVal — 设置输出电平

unsigned int IoTGpioSetOutputVal(unsigned int gpio, IotGpioValue value);
参数 说明
gpio GPIO 引脚号
value 电平值:IOT_GPIO_VALUE0(低)/ IOT_GPIO_VALUE1(高)

3.4 其他常用 GPIO API

API 功能
IoTGpioGetInputVal 读取输入电平
IoTGpioSetPull 设置上下拉电阻
IoTGpioRegisterIsrCallback 注册中断回调
IoTGpioSetIsrMask 使能/屏蔽中断
IoTGpioDeinit 反初始化 GPIO

四、Hi3861 GPIO 引脚说明

Hi3861 芯片 GPIO 引脚(部分):

GPIO 0  ~ GPIO 7  : 通用 I/O,部分复用为 SPI/I2C/UART
GPIO 8  ~ GPIO 11 : 通用 I/O,PWM 功能
GPIO 12 ~ GPIO 14 : 通用 I/O,ADC 功能

开发板常见连接:
- GPIO 9 : 板载 LED(部分开发板)
- GPIO 10: 板载 LED(部分开发板)
- GPIO 11: 按键(部分开发板)
- GPIO 12: 蜂鸣器(部分开发板)

注意:不同厂商开发板引脚定义可能不同,请查看原理图确认。

五、硬件连接

5.1 板载 LED

如果开发板已有 LED 连接到 GPIO 9,无需额外接线,直接烧录运行。

5.2 外接 LED

如果 GPIO 9 没有板载 LED,可外接:

Hi3861 GPIO 9  ──┬──[电阻 330Ω]──┬── LED 正极(长脚)
                 │               │
                GND            LED 负极(短脚)

注意:LED 极性,长脚为正极。电阻限流,防止烧坏 LED。


六、编译与验证

6.1 编译烧录

VSCode 点击 BuildUpload,串口波特率 115200

6.2 预期现象

  • 开发板 LED 快速闪烁(50ms 亮,50ms 灭,频率 10Hz)
  • 串口输出 LED_SPARK! 共 100 次

6.3 预期输出

 LED_SPARK!
 LED_SPARK!
 LED_SPARK!
...

七、练习:修改闪烁频率

尝试修改代码,实现不同效果:

效果 修改方法
慢闪(1Hz) DELAY_TICKS_50 改为 500
快闪(20Hz) DELAY_TICKS_50 改为 25
呼吸灯(PWM) 使用 IoTPwmInit 替代 GPIO 翻转
双 LED 交替 增加 GPIO 10 控制第二个 LED

八、总结

要点 内容
GPIO 初始化 IoTGpioInit(gpio)
设置方向 IoTGpioSetDir(gpio, IOT_GPIO_DIR_OUT)
输出电平 IoTGpioSetOutputVal(gpio, val)
输入读取 IoTGpioGetInputVal(gpio, &val)
头文件路径 //base/iot_hardware/peripheral/interfaces/kits
硬件注意 确认开发板 LED 连接引脚,注意极性

九、下一步

Day 11 预告:UART 串口通信 —— 与外部设备数据交互。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐