天天看點

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