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

连志安
发布于 2020-10-12 15:33
浏览
4收藏

摘要:本文简单介绍如何操作GPIO去点灯

适合群体:适用于Hi3861开发板,L0轻量系统驱动开发

 

5.1点灯例程源码

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

源码结构如下:

OpenHarmony轻量系统开发【5】驱动之GPIO点灯-鸿蒙开发者社区

 

 

第一个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灯一直在闪烁。

OpenHarmony轻量系统开发【5】驱动之GPIO点灯-鸿蒙开发者社区

 

5.2 驱动框架

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

  

OpenHarmony轻量系统开发【5】驱动之GPIO点灯-鸿蒙开发者社区

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

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

OpenHarmony轻量系统开发【5】驱动之GPIO点灯-鸿蒙开发者社区

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

“device\soc\hisilicon\hi3861v100\hi3861_adapter\hals\iot_hardware\wifiiot_lite”

相关文件如下:

  OpenHarmony轻量系统开发【5】驱动之GPIO点灯-鸿蒙开发者社区

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

所以我们可以总结如下:

 

5.3 GPIO相OpenHarmony轻量系统开发【5】驱动之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);

分类
标签
已于2022-1-21 14:31:27修改
5
收藏 4
回复
举报
13条回复
按时间正序
/
按时间倒序
啧啧啧GKD
啧啧啧GKD

老师好给力  高产!

回复
2020-10-12 15:44:09
鲜橙加冰
鲜橙加冰

物联大计,点灯起步。

回复
2020-10-12 15:55:05
蒋莉丶
蒋莉丶

老师,我在看你的leddemo的代码里边

 //osThreadAttr_t attr;    这里屏蔽的话,执行到下面应该会报错的吧,attr的句柄没有呢

回复
2020-10-24 11:41:43
连志安
连志安 回复了 蒋莉丶
老师,我在看你的leddemo的代码里边 //osThreadAttr_t attr; 这里屏蔽的话,执行到下面应该会报错的吧,attr的句柄没有呢

是的,有点问题,不能屏蔽掉

回复
2020-10-24 23:12:18
knmb99
knmb99

您好,程序上传了是撒反应呢?我穿了之后没反应

回复
2020-10-28 11:23:57
连志安
连志安 回复了 knmb99
您好,程序上传了是撒反应呢?我穿了之后没反应

应该是LED灯会重复闪烁

回复
2020-10-28 11:57:40
wx6110cfc68dcf2
wx6110cfc68dcf2

为什么我的没有闪烁,而是一直亮着,不是开发板问题,换了好几个了

回复
2021-8-13 13:14:48
华为开发者联盟生态市场
华为开发者联盟生态市场

了解更多HarmonyOS相关产品~请戳:【华为开发者联盟生态市场HarmonyOS专区https://developer.huawei.com/consumer/cn/market/prod-list?categoryIdL1=1fc1b638cf8d4e93a6542a505f916ad6】

回复
2021-8-13 13:57:17
txwtech
txwtech

博主好,鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢?

code 2.0 LTS支持,canary没有这个功能呢

IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP);

谢谢

回复
2021-8-19 09:14:10
料峭春风Z
料峭春风Z

老师代码最后好像漏了个SYS_RUN(led_demo);

我加了这个led灯才开始闪烁的。

已于2022-5-8 23:02:47修改
回复
2022-5-8 23:02:16
东莞扫黄大队
东莞扫黄大队 回复了 料峭春风Z
老师代码最后好像漏了个SYS_RUN(led_demo); 我加了这个led灯才开始闪烁的。

是的,就是这个问题

回复
2022-5-25 16:59:27
wx62b7d965594a7
wx62b7d965594a7

请问为什么我烧录进去没反应呢

回复
2022-6-26 13:56:42
Z·y
Z·y 回复了 wx62b7d965594a7
请问为什么我烧录进去没反应呢

最后好像漏了个SYS_RUN(led_demo);

回复
2022-7-15 20:37:55
回复
    相关推荐