如何操作GPIO去点灯

描述

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

 本文适用于正在研究Hi3861开发板,L0轻量系统驱动开发的小伙伴

1、点灯例程源码

先看最简单得LED灯闪烁操作,源码结构如下:

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 #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!
");    }    }

SYS_RUN(led_demo);

向右滑动查看完整代码

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

led

2、驱动框架

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

led

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

led

所以我们可以知道,具体的路径就是“devicesochisiliconhi3861v100hi3861_adapterhalsiot_hardwarewifiiot_lite”,相关文件如下:

led

这里是代码实现,具体是将hi3861相关的驱动接口封装成鸿蒙的驱动接口。所以我们可以总结如下:

led

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 表示中断函数是否被屏蔽。 * 值1表示屏蔽中断功能,0表示不屏蔽中断功能。 * @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);

向右滑动查看完整代码

原文标题:OpenHarmony轻量系统开发【5】驱动之GPIO点灯

文章出处:【微信公众号:HarmonyOS官方合作社区】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分