OpenHarmony轻量系统开发【5】驱动之GPIO点灯

5.1点灯例程源码

先看最简单得LED灯闪烁操作

源码结构如下:

第一个BUILD.gn文件内容:

static_library("led_demo") {
    sources = [
        "led_demo.c"
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/peripheral/interfaces/kits",
    ]
}

第二个BUILD.gn内容:

# Copyright (c) 2020 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

lite_component("app") {
    features = [
        "led_demo:led_demo",
    ]
}

led_demo.c内容:

#include <unistd.h>
#include "stdio.h"
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"

#define LED_TEST_GPIO 9 // for hispark_pegasus

void *LedTask(const char *arg)
{
    //初始化GPIO
    IoTGpioInit(LED_TEST_GPIO);

    //设置为输出
    IoTGpioSetDir(LED_TEST_GPIO, IOT_GPIO_DIR_OUT);

    (void)arg;
    while (1) 
    {
        //输出低电平
        IoTGpioSetDir(LED_TEST_GPIO, 0);
        usleep(300000);
        //输出高电平
        IoTGpioSetDir(LED_TEST_GPIO, 1);
        usleep(300000);
    }

    return NULL;
}

void led_demo(void)
{
    osThreadAttr_t attr;

    attr.name = "LedTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 512;
    attr.priority = 26;

    if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
        printf("[LedExample] Falied to create LedTask!\n");
    }

}

编译后烧录进去,应该可以看到复位按键旁边的LED灯一直在闪烁。

5.2 驱动框架

OpenHarmony为轻量系统提供了一套简单的驱动封装接口,函数的定义相关头文件位于"base\iot_hardware\peripheral\interfaces\kits"

这里只有头文件,具体的函数实现,需要在对应的soc中,具体路径定义由

device\board\hisilicon\hispark_pegasus\liteos_m\config.gni 文件中定义:

所以我们可以知道,具体的路径就是

"device\soc\hisilicon\hi3861v100\hi3861_adapter\hals\iot_hardware\wifiiot_lite"

相关文件如下:

这里是代码实现,具体是将hi3861相关的驱动接口封装成鸿蒙的驱动接口。

所以我们可以总结如下:

5.3 GPIO相

关接口函数

(1)相关枚举:

/**
  * @brief 枚举 GPIO 电平值。
  */
类型定义枚举 {
     /** 低 GPIO 电平 */
     IOT_GPIO_VALUE0 = 0,
     /** 高 GPIO 电平 */
     IOT_GPIO_VALUE1
} IotGpioValue;

/**
  * @brief 枚举 GPIO 方向。
  */
类型定义枚举 {
     /** 输入 */
     IOT_GPIO_DIR_IN = 0,
     /** 输出 */
     IOT_GPIO_DIR_OUT
} IotGpioDir;

/**
  * @brief 枚举 GPIO 中断触发模式。
  */
类型定义枚举 {
     /** 电平敏感中断 */
     IOT_INT_TYPE_LEVEL = 0,
     /** 边缘敏感中断 */
     IOT_INT_TYPE_EDGE
} IotGpioIntType;

/**
  * @brief 枚举 I/O 中断极性。
  */
类型定义枚举 {
     /** 低电平或下降沿中断 */
     IOT_GPIO_EDGE_FALL_LEVEL_LOW = 0,
     /** 高电平或上升沿中断 */
     IOT_GPIO_EDGE_RISE_LEVEL_HIGH
} IotGpioIntPolarity;

(2)普通GPIO相关API

/**
 * @brief 表示 GPIO 中断回调。
 *
 */
typedef void (*GpioIsrCallbackFunc) (char *arg);

/**
 * @brief 初始化一个 GPIO 设备。
 *
 * @param id 表示 GPIO 引脚号。
 * @return 如果 GPIO 设备已初始化,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioInit(unsigned int id);

/**
 * @brief 取消初始化 GPIO 设备。
 *
 * @param id 表示 GPIO 引脚号。
 * @return 如果 GPIO 设备被取消初始化,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioDeinit(unsigned int id);

/**
 * @brief 设置 GPIO 引脚的方向。
 *
 * @param id 表示 GPIO 引脚号。
 * @param dir 指示 GPIO 输入/输出方向。
 * @return 如果设置了方向,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioSetDir(unsigned int id, IotGpioDir dir);

/**
 * @brief 获取 GPIO 引脚的方向。
 *
 * @param id 表示 GPIO 引脚号。
 * @param dir 指示指向 GPIO 输入/输出方向的指针。
 * @return 如果获取到方向,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioGetDir(unsigned int id, IotGpioDir *dir);

/**
 * @brief 设置 GPIO 引脚的输出电平值。
 *
 * @param id 表示 GPIO 引脚号。
 * @param val 表示输出电平值。
 * @return 如果设置了输出级别值,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioSetOutputVal(unsigned int id,IotGpioValue val);

/**
 * @brief 获取 GPIO 引脚的输出电平值。
 *
 * @param id 表示 GPIO 引脚号。
 * @param val 表示指向输出电平值的指针。
 * @return 如果获得输出电平值,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioGetOutputVal(unsigned int id, IotGpioValue *val);

/**
 * @brief 获取 GPIO 引脚的输入电平值。
 *
 * @param id 表示 GPIO 引脚号。
 * @param val 表示指向输入电平值的指针。
 * @return 如果获得输入电平值,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioGetInputVal(unsigned int id, IotGpioValue *val);

(3)按键中断相关API

/**
 * @brief 启用 GPIO 引脚的中断功能。
 *
 * 该函数可用于设置GPIO引脚的中断类型、中断极性和中断回调。
 *
 * @param id 表示 GPIO 引脚号。
 * @param intType 表示中断类型。
 * @param intPolarity 指示中断极性。
 * @param func 表示中断回调函数。
 * @param arg 表示指向中断回调函数中使用的参数的指针。
 * @return 如果启用中断功能,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioRegisterIsrFunc(unsigned int id,IotGpioIntType intType,IotGpioIntPolarity intPolarity,
                                    GpioIsrCallbackFunc fun,char *arg);

/**
 * @brief 禁用 GPIO 引脚的中断功能。
 *
 * @param id 表示 GPIO 引脚号。
 * @return 如果中断功能被禁用,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioUnregisterIsrFunc(unsigned int id);

/**
 * @brief 屏蔽 GPIO 引脚的中断功能。
 *
 * @param id 表示 GPIO 引脚号。
 * @param mask 表示中断函数是否被屏蔽。
 * 值<b>1</b>表示屏蔽中断功能,<b>0</b>表示不屏蔽中断功能。
 * @return 如果中断功能被屏蔽,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioSetIsrMask(unsigned int id, unsigned char mask);

/**
 * @brief 设置 GPIO 引脚的中断触发模式。
 *
 * 此函数根据中断类型和中断极性配置 GPIO 引脚。
 *
 * @param id 表示 GPIO 引脚号。
 * @param intType 表示中断类型。
 * @param intPolarity 指示中断极性。
 * @return 如果设置了中断触发模式,则返回 {@link IOT_SUCCESS};
 * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
 * @从 2.2 开始
 * @2.2 版
 */
unsigned int IoTGpioSetIsrMode(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity);

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ......

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题

2.性能优化方向

3.架构方向

4.鸿蒙开发系统底层方向

5.鸿蒙音视频开发方向

6.鸿蒙车载开发方向

7.鸿蒙南向开发方向

相关推荐
轻口味21 分钟前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王1 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发1 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀1 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪2 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef3 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
sunshine6414 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
真滴book理喻4 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云4 小时前
npm淘宝镜像
前端·npm·node.js