摘要:本文簡(jiǎn)單介紹如何操作GPIO去點(diǎn)燈
本文適用于正在研究Hi3861開發(fā)板,L0輕量系統(tǒng)驅(qū)動(dòng)開發(fā)的小伙伴1、點(diǎn)燈例程源碼
先看最簡(jiǎn)單得LED燈閃爍操作,源碼結(jié)構(gòu)如下:
第一個(gè)BUILD.gn文件內(nèi)容:
static_library("led_demo") {
sources = [
"led_demo.c"
]
include_dirs = [
"http://utils/native/lite/include",
"http://kernel/liteos_m/components/cmsis/2.0",
"http://base/iot_hardware/peripheral/interfaces/kits",
]
}
向右滑動(dòng)查看完整代碼
第二個(gè)BUILD.gn內(nèi)容:
# Copyright (c) 2020 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# You may obtain a copy of the License at
#
#
# Unless required by applicable law or agreed to in writing, software
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
import("http://build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"led_demo:led_demo",
]
}
向右滑動(dòng)查看完整代碼
led_demo.c內(nèi)容:
void *LedTask(const char *arg)
{
//初始化GPIO
IoTGpioInit(LED_TEST_GPIO);
//設(shè)置為輸出
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);
向右滑動(dòng)查看完整代碼
編譯后燒錄進(jìn)去,應(yīng)該可以看到復(fù)位按鍵旁邊的LED燈一直在閃爍。
2、驅(qū)動(dòng)框架
OpenHarmony為輕量系統(tǒng)提供了一套簡(jiǎn)單的驅(qū)動(dòng)封裝接口,函數(shù)的定義相關(guān)頭文件位于“baseiot_hardwareperipheralinterfaceskits”
這里只有頭文件,具體的函數(shù)實(shí)現(xiàn),需要在對(duì)應(yīng)的soc中,具體路徑定義由deviceoardhisiliconhispark_pegasusliteos_mconfig.gni 文件中定義:
所以我們可以知道,具體的路徑就是“devicesochisiliconhi3861v100hi3861_adapterhalsiot_hardwarewifiiot_lite”,相關(guān)文件如下:
這里是代碼實(shí)現(xiàn),具體是將hi3861相關(guān)的驅(qū)動(dòng)接口封裝成鴻蒙的驅(qū)動(dòng)接口。所以我們可以總結(jié)如下:
3、GPIO相關(guān)接口函數(shù)
(1)相關(guān)枚舉:
/**
* @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 中斷觸發(fā)模式。
*/
類型定義枚舉 {
/** 電平敏感中斷 */
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;
向右滑動(dòng)查看完整代碼
(2)普通GPIO相關(guān)API
/**
* @brief 表示 GPIO 中斷回調(diào)。
*
*/
typedef void (*GpioIsrCallbackFunc) (char *arg);
/**
* @brief 初始化一個(gè) GPIO 設(shè)備。
*
* @param id 表示 GPIO 引腳號(hào)。
* @return 如果 GPIO 設(shè)備已初始化,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioInit(unsigned int id);
/**
* @brief 取消初始化 GPIO 設(shè)備。
*
* @param id 表示 GPIO 引腳號(hào)。
* @return 如果 GPIO 設(shè)備被取消初始化,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioDeinit(unsigned int id);
/**
* @brief 設(shè)置 GPIO 引腳的方向。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param dir 指示 GPIO 輸入/輸出方向。
* @return 如果設(shè)置了方向,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioSetDir(unsigned int id, IotGpioDir dir);
/**
* @brief 獲取 GPIO 引腳的方向。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param dir 指示指向 GPIO 輸入/輸出方向的指針。
* @return 如果獲取到方向,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioGetDir(unsigned int id, IotGpioDir *dir);
/**
* @brief 設(shè)置 GPIO 引腳的輸出電平值。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param val 表示輸出電平值。
* @return 如果設(shè)置了輸出級(jí)別值,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioSetOutputVal(unsigned int id,IotGpioValue val);
/**
* @brief 獲取 GPIO 引腳的輸出電平值。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param val 表示指向輸出電平值的指針。
* @return 如果獲得輸出電平值,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioGetOutputVal(unsigned int id, IotGpioValue *val);
/**
* @brief 獲取 GPIO 引腳的輸入電平值。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param val 表示指向輸入電平值的指針。
* @return 如果獲得輸入電平值,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioGetInputVal(unsigned int id, IotGpioValue *val);
向右滑動(dòng)查看完整代碼
(3)按鍵中斷相關(guān)API
/**
* @brief 啟用 GPIO 引腳的中斷功能。
*
* 該函數(shù)可用于設(shè)置GPIO引腳的中斷類型、中斷極性和中斷回調(diào)。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param intType 表示中斷類型。
* @param intPolarity 指示中斷極性。
* @param func 表示中斷回調(diào)函數(shù)。
* @param arg 表示指向中斷回調(diào)函數(shù)中使用的參數(shù)的指針。
* @return 如果啟用中斷功能,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioRegisterIsrFunc(unsigned int id,IotGpioIntType intType,IotGpioIntPolarity intPolarity,
GpioIsrCallbackFunc fun,char *arg);
/**
* @brief 禁用 GPIO 引腳的中斷功能。
*
* @param id 表示 GPIO 引腳號(hào)。
* @return 如果中斷功能被禁用,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioUnregisterIsrFunc(unsigned int id);
/**
* @brief 屏蔽 GPIO 引腳的中斷功能。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param mask 表示中斷函數(shù)是否被屏蔽。
* 值1表示屏蔽中斷功能,0表示不屏蔽中斷功能。
* @return 如果中斷功能被屏蔽,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioSetIsrMask(unsigned int id, unsigned char mask);
/**
* @brief 設(shè)置 GPIO 引腳的中斷觸發(fā)模式。
*
* 此函數(shù)根據(jù)中斷類型和中斷極性配置 GPIO 引腳。
*
* @param id 表示 GPIO 引腳號(hào)。
* @param intType 表示中斷類型。
* @param intPolarity 指示中斷極性。
* @return 如果設(shè)置了中斷觸發(fā)模式,則返回 {@link IOT_SUCCESS};
* 否則返回 {@link IOT_FAILURE}。其他返回值詳見(jiàn)芯片說(shuō)明。
* @從 2.2 開始
* @2.2 版
*/
unsigned int IoTGpioSetIsrMode(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity);
向右滑動(dòng)查看完整代碼
原文標(biāo)題:OpenHarmony輕量系統(tǒng)開發(fā)【5】驅(qū)動(dòng)之GPIO點(diǎn)燈
文章出處:【微信公眾號(hào):HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅
-
led
+關(guān)注
關(guān)注
240文章
23134瀏覽量
658408 -
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1825瀏覽量
85178 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4943瀏覽量
97188
原文標(biāo)題:OpenHarmony輕量系統(tǒng)開發(fā)【5】驅(qū)動(dòng)之GPIO點(diǎn)燈
文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論