鸿蒙南向开发教程 Day 10:GPIO 控制 LED 闪烁
·
目标:掌握 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 点击 Build → Upload,串口波特率 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 串口通信 —— 与外部设备数据交互。
更多推荐


所有评论(0)