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

这篇具有很好参考价值的文章主要介绍了OpenHarmony轻量系统开发【5】驱动之GPIO点灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要:本文简单介绍如何操作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文章来源地址https://www.toymoban.com/news/detail-471693.html

/**
 * @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);

到了这里,关于OpenHarmony轻量系统开发【5】驱动之GPIO点灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(49)
  • 【Linux驱动开发】011 gpio子系统

    前面我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。   Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于

    2024年02月03日
    浏览(46)
  • <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动

    <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分) <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分

    2024年02月13日
    浏览(38)
  • OpenHarmony 标准系统 HDF 框架音视频驱动开发

    OpenHarmony 操作系统为了做到给千行百业提供全场景业务能力,达到设备快速互联、硬件互助、资源共享;统一 OS、一次开发多端弹性部署的目标。在此背景下 OpenHarmony 提出在传统的单设备系统能力基础上,基于同一套系统能力、适配多种终端形态的分布式理念,并且内核层、

    2023年04月22日
    浏览(49)
  • 【Linux驱动开发】012 gpio子系统API函数

    设置好设备树以后, 在驱动程序中就可以使用 gpio 子系统提供的 API 函数来操作指定的 GPIO, gpio 子系统向驱动开发人员屏蔽了具体的读写寄存器过程。这就是驱动分层与分离的好处,大家各司其职,做好自己的本职工作即可。 gpio 子系统提供的常用的 API 函数有下面几个:

    2023年04月18日
    浏览(40)
  • Linux驱动开发之【pinctrl和gpio子系统】

    目录 一、 pinctrl和gpio子系统 1.pinctrl子系统 1.1 pinctrl子系统简介 1.2 pinctrl子系统驱动 1.3 设备树中添加pinctrl节点模版 2. gpio子系统 2.1 gpio子系统简介 2.2 gpio子系统驱动 2.3 gpio子系统API函数 2.4 设备树中添加gpio节点模板 2.5 与gpio相关的OF函数 3. 驱动程序编写 3.1 驱动入口函数 3

    2024年02月06日
    浏览(42)
  • [驱动开发]gpio子系统及中断实现led亮灭

    编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制发光二极管亮灭 2.按键1按下,led1电位反转;按键2按下,led2电位反转;按键3按下,led3电位反转   

    2024年02月14日
    浏览(75)
  • 嵌入式Linux驱动开发之点灯

      使用驱动开发的方式点亮一个LED灯。看看两者有啥区别不? 首先查看原理图,看看我们的板子上的LED等接在哪一个IO口上面。 好了,看原理图我们知道LED灯接在芯片的GPIO1的第三个引脚上面,也就是GPIO1_IO03。 先掌握三个名词 CCM: Clock Controller Module (时钟控制模块) IOMUXC : I

    2024年02月01日
    浏览(97)
  • OpenHarmony实战开发-如何实现一个轻量级输入法应用。

    ​ 本示例使用inputMethodEngine实现一个轻量级输入法应用kikaInput,支持在运行OpenHarmony OS的智能终端上。 使用说明 1.使用hdc shell aa start ability -a InputMethod -b cn.openharmony.inputmethodchoosedialog命令拉起切换输入法弹窗,点击kikainput切换输入法到当前应用。 2.点击应用中的编辑框,拉起

    2024年04月24日
    浏览(54)
  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包