精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇(上)

系統(tǒng) OpenHarmony
? 驅(qū)動開發(fā)是指為操作系統(tǒng)或硬件設(shè)備編寫軟件驅(qū)動程序的過程。驅(qū)動程序是一種特殊的軟件,它與操作系統(tǒng)或硬件設(shè)備進行交互,以使它們能夠有效地通信和協(xié)同工作。

想了解更多關(guān)于開源的內(nèi)容,請訪問:

51CTO 開源基礎(chǔ)軟件社區(qū)

https://ost.51cto.com

前言

下面我們繼續(xù)跟著架構(gòu)圖去學(xué)習(xí)另一個板塊——驅(qū)動,本片將介紹。

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

驅(qū)動開發(fā)簡介

什么是驅(qū)動開發(fā)呢,回想我們之前介紹內(nèi)核的時候,內(nèi)核的作用是幫助我們完成對硬件的操控的,我們已經(jīng)通過KAL內(nèi)核抽象層提供的規(guī)范接口,實現(xiàn)了對內(nèi)核的一些基本控制,但是并沒有涉及到硬件設(shè)備,那么驅(qū)動開發(fā)的含意就呼之欲出了。

驅(qū)動開發(fā)是指為操作系統(tǒng)或硬件設(shè)備編寫軟件驅(qū)動程序的過程。驅(qū)動程序是一種特殊的軟件,它與操作系統(tǒng)或硬件設(shè)備進行交互,以使它們能夠有效地通信和協(xié)同工作。通俗點講就是IO控制硬件設(shè)備。IO流在讀寫文件時大家都會用到,我們的驅(qū)動也像IO流,只不過操作的對象不在是虛擬的文件,而是你手中的開發(fā)板,實實在在摸得到的硬件設(shè)備。

硬件設(shè)備介紹

硬件總覽

筆者使用的是智能家居開發(fā)套件:Hi3861

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

硬件詳細介紹

底板

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

核心板

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

oled屏幕

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

交通燈

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

RGB燈板

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

環(huán)境檢測板

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

NFC

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

驅(qū)動開發(fā)

GPIO

GPIO可以理解為數(shù)字I/O,是一種電平控制,由0和1表示,0表示低電平,1表示高電平。Hi3861芯片一共有15各個GPIO引腳,芯片內(nèi)部集成了GPIO模塊,方便我們?nèi)ナ褂谩?/p>

Hi3861 GPIO 引腳分布

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

IoT接口

OprnHarmony提供了操作物聯(lián)網(wǎng)各種外接設(shè)備的一組API,方便我們?nèi)タ刂婆c外接設(shè)備的交互。一共有三類IoT接口。

  • HAL硬件抽象層接口。
  • HDF硬件驅(qū)動框架接口。
  • 海思SDK接口。

其中HDF接口是主推接口,在上面的架構(gòu)圖中也能看到,海思的SDK是原廠商提供的底層接口。

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

GPIO控制流程

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

IoT編程工作環(huán)境補充

在源碼目錄生成的 .vscode的目錄下的 c_cpp_properties.json 文件中做出如下添加。

[注:目錄可能因為源碼版本不同而不一致,這里可以手動搜索文件來確定庫的存放位置]。

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

打開 usr_config.mk 文件 修改如下配置,防止后續(xù)的操作中出現(xiàn)編譯錯誤,筆者報錯時,也是在這卡了很久。這個配置項默認是關(guān)閉的,就會導(dǎo)致某些庫中的方法無法被識別,編譯就會出問題,主要是pwm模塊的使用,這里提前說一下。

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

GPIO-API

  1. GPIO初始化。
unsigned int IoTGpioInit(unsigned int id);

參數(shù)解釋:

  • id: GPIO的引腳編號。

返回值:

  • IOT_SUCCESS:如果GPIO設(shè)備成功初始化,則返回該值。
  • IOT_FAILURE:如果GPIO設(shè)備初始化失敗,則返回該值。
  1. GPIO參數(shù)設(shè)置。
unsigned int IoTGpioSetDir(unsigned int id, IotGpioDir dir);

參數(shù)解釋:

  • id: GPIO的引腳編號。
  • dir: 設(shè)置GPIO為輸入/輸出。

返回值:

  • IOT_SUCCESS:如果GPIO設(shè)備成功設(shè)置,則返回該值。
  • IOT_FAILURE:如果GPIO設(shè)備設(shè)置失敗,則返回該值。

其中,IotGPIODir 的定義如下的枚舉類型:

typedef enum {
    /** Input */
    IOT_GPIO_DIR_IN = 0,
    /** Output */
    IOT_GPIO_DIR_OUT
} IotGpioDir;
  1. 設(shè)置GPIO輸出狀態(tài)。
unsigned int IoTGpioSetOutputVal(unsigned int id, IotGpioValue val);

參數(shù)解釋:

  • id: GPIO的引腳編號。
  • val: 輸出的電平值。

返回值:

  • IOT_SUCCESS:如果GPIO設(shè)備成功設(shè)置,則返回該值。
  • IOT_FAILURE:如果GPIO設(shè)備設(shè)置失敗,則返回該值。

其中,IotGPIOValue的定義如下的枚舉類型:

typedef enum {
    /** Low GPIO level */
    IOT_GPIO_VALUE0 = 0,
    /** High GPIO level */
    IOT_GPIO_VALUE1
} IotGpioValue;
  1. 解除GPIO。
unsigned int IoTGpioDeinit(unsigned int id);

參數(shù)解釋:

  • id: GPIO的引腳編號

返回值:

  • IOT_SUCCESS:如果GPIO設(shè)備成功解除,則返回該值。
  • IOT_FAILURE:如果GPIO設(shè)備解除失敗,則返回該值。
  1. 獲取GPIO引腳狀態(tài)。
unsigned int IoTGpioGetOutputVal(unsigned int id, IotGpioValue *val);

參數(shù)解釋:

  • id: GPIO的引腳編號
  • *val: 獲取輸出的電平值的指針

返回值:

  • IOT_SUCCESS:如果GPIO設(shè)備成功獲取,則返回該值。
  • IOT_FAILURE:如果GPIO設(shè)備獲取失敗,則返回該值。

這個API和設(shè)置GPIO引腳的API很像,只不過val屬性變成了個指針,也就通過這個指針幫我們獲取到GPIO的引腳狀態(tài)的。

  1. 引腳中斷函數(shù)注冊。
unsigned int IoTGpioRegisterIsrFunc(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity,
                                    GpioIsrCallbackFunc func, char *arg);

參數(shù)解釋:

  • id:GPIO引腳的編號。
  • intType:中斷類型。
  • intPolarity:中斷極性。
  • func:中斷回調(diào)函數(shù)。
  • arg:中斷回調(diào)函數(shù)中使用的參數(shù)的指針。

返回值:

  • IOT_SUCCESS:如果成功啟用GPIO引腳的中斷功能,則返回該值。
  • IOT_FAILURE:如果啟用GPIO引腳的中斷功能失敗,則返回該值。

其中 IotGpioIntType 定義如下的枚舉類型。

typedef enum {
    /** Level-sensitive interrupt */
    IOT_INT_TYPE_LEVEL = 0,
    /** Edge-sensitive interrupt */
    IOT_INT_TYPE_EDGE
} IotGpioIntType;

IOT_INT_TYPE_LEVEL:表示電平觸發(fā)的中斷類型。這種中斷類型基于GPIO引腳的電平狀態(tài)進行觸發(fā),即當(dāng)引腳的電平為特定的電平(例如高電平或低電平)時觸發(fā)中斷。

IOT_INT_TYPE_EDGE:表示邊沿觸發(fā)的中斷類型。這種中斷類型基于GPIO引腳的電平變化進行觸發(fā),即當(dāng)引腳的電平從一個狀態(tài)變化到另一個狀態(tài)(例如從低電平到高電平或從高電平到低電平)時觸發(fā)中斷。

IotGpioIntPolarity 定義如下的枚舉類型。

typedef enum {
    /** Interrupt at a low level or falling edge */
    IOT_GPIO_EDGE_FALL_LEVEL_LOW = 0,
    /** Interrupt at a high level or rising edge */
    IOT_GPIO_EDGE_RISE_LEVEL_HIGH
} IotGpioIntPolarity;

IOT_GPIO_EDGE_FALL_LEVEL_LOW:表示在低電平或下降沿觸發(fā)中斷。這意味著當(dāng)GPIO引腳的電平為低電平時或引腳的電平從高電平變?yōu)榈碗娖綍r,觸發(fā)中斷。

IOT_GPIO_EDGE_RISE_LEVEL_HIGH:表示在高電平或上升沿觸發(fā)中斷。這意味著當(dāng)GPIO引腳的電平為高電平時或引腳的電平從低電平變?yōu)楦唠娖綍r,觸發(fā)中斷。

當(dāng)我們向外界設(shè)備進行輸入流操作時,需要處理一些業(yè)務(wù)邏輯,在中斷函數(shù)中完成,后面會后案例讓大家體會。

  1. 引腳中斷函數(shù)解除。
unsigned int IoTGpioUnregisterIsrFunc(unsigned int id);

參數(shù)解釋:

  • id:GPIO引腳的編號。

返回值:

  • IOT_SUCCESS:如果成功解除GPIO引腳的中斷功能,則返回該值。
  • IOT_FAILURE:如果解除GPIO引腳的中斷功能失敗,則返回該值。

解除類型的API都比較簡單。

  1. 設(shè)置引腳的功能復(fù)用。
hi_u32 hi_io_set_func(hi_io_name id, hi_u8 val);

參數(shù)解釋:

  • id:硬件管腳的枚舉類型 hi_io_name,表示要設(shè)置復(fù)用功能的IO索引。
  • val:復(fù)用功能的枚舉類型 hi_u8,表示要設(shè)置的復(fù)用功能。根據(jù)待設(shè)置的硬件管腳,從給定的枚舉值中選擇相應(yīng)的功能。

返回值:

  • 0:成功設(shè)置復(fù)用功能。
  • HI_ERR_GPIO_INVALID_PARAMETER:設(shè)置復(fù)用功能失敗,輸入?yún)?shù)無效或不支持的功能。

其中 hi_io_name 的美劇類型定義如下:

typedef enum {
    HI_IO_NAME_GPIO_0,     /**< GPIO0 */
    HI_IO_NAME_GPIO_1,     /**< GPIO1 */
    HI_IO_NAME_GPIO_2,     /**< GPIO2 */
    HI_IO_NAME_GPIO_3,     /**< GPIO3 */
    HI_IO_NAME_GPIO_4,     /**< GPIO4 */
    HI_IO_NAME_GPIO_5,     /**< GPIO5 */
    HI_IO_NAME_GPIO_6,     /**< GPIO6 */
    HI_IO_NAME_GPIO_7,     /**< GPIO7 */
    HI_IO_NAME_GPIO_8,     /**< GPIO8 */
    HI_IO_NAME_GPIO_9,     /**< GPIO9 */
    HI_IO_NAME_GPIO_10,    /**< GPIO10 */
    HI_IO_NAME_GPIO_11,    /**< GPIO11 */
    HI_IO_NAME_GPIO_12,    /**< GPIO12 */
    HI_IO_NAME_GPIO_13,    /**< GPIO13 */
    HI_IO_NAME_GPIO_14,    /**< GPIO14 */
    HI_IO_NAME_SFC_CSN,    /**< SFC_CSN */
    HI_IO_NAME_SFC_IO1,    /**< SFC_IO1 */
    HI_IO_NAME_SFC_IO2,    /**< SFC_IO2 */
    HI_IO_NAME_SFC_IO0,    /**< SFC_IO0 */
    HI_IO_NAME_SFC_CLK,    /**< SFC_CLK */
    HI_IO_NAME_SFC_IO3,    /**< SFC_IO3 */
    HI_IO_NAME_MAX,
} hi_io_name;

hi_u8 的定義如下:

typedef unsigned char           hi_u8;

Hi3861的引腳數(shù)量少,很多功能都是被集成在同一個引腳上的,因此需要我們?nèi)ミx擇引腳配置。

  1. 啟用某個IO引腳的上下拉功能。
hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val);

參數(shù)解釋:

  • id:硬件管腳的枚舉類型 hi_io_name,表示要設(shè)置上下拉功能的IO引腳的索引。
  • val:上下拉狀態(tài)的枚舉類型 hi_io_pull,表示要設(shè)置的上下拉狀態(tài)。

返回值:

  • 0:成功設(shè)置上下拉功能。
  • HI_ERR_GPIO_INVALID_PARAMETER:設(shè)置上下拉功能失敗,輸入?yún)?shù)無效或不支持的功能。

其中 hi_io_pull 的定義如下的枚舉類型:

typedef enum {
    HI_IO_PULL_NONE,    /**< Disabled.CNcomment:無拉CNend */
    HI_IO_PULL_UP,      /**< Pull-up enabled.CNcomment:上拉CNend */
    HI_IO_PULL_DOWN,    /**< Pull-down enabled.CNcomment:下拉CNend */
    HI_IO_PULL_MAX,     /**< Invalid.CNcomment:無效值CNend */
} hi_io_pull;

上下拉功能可用于確定GPIO引腳的輸入電平狀態(tài)。例如,通過啟用上拉功能,可以將引腳的輸入電平拉高,使其在未連接外部設(shè)備時保持為高電平狀態(tài)。這樣,在檢測外部設(shè)備連接時,可以通過讀取引腳的輸入電平狀態(tài)來確定設(shè)備的連接狀態(tài)。

GPIO控制LED案例

能夠使用我們的user按鍵控制可編程led燈的熄滅與點亮。

思路:通過讀取按鍵的電平狀態(tài),觸發(fā)中斷回調(diào)函數(shù),修改led的電平。

  1. 新建樣例目錄。
    applications/sample/wifi-iot/app/led_gpio_demo
  2. 新建源文件和gn文件。
    applications/sample/wifi-iot/app/led_gpio_demo/ledGpio.c
    applications/sample/wifi-iot/app/led_gpio_demo/BUILD.gn
  3. 編寫源文件,ledGpio.c [筆者加了詳細的注釋,就直接上代碼了]。
// C語言標(biāo)準(zhǔn)庫
#include <stdio.h>
// 初始化庫
#include "ohos_init.h"
// 內(nèi)核編程標(biāo)準(zhǔn)接口
#include "cmsis_os2.h"
// IoT接口 GPIO
#include "iot_gpio.h"
// 海思SDK IO
#include "hi_io.h"

// 定義引腳的編號
#define LED_GPIO 9
#define BUTTON_GPIO 5

// 定義ledPin(電平)低電平led點亮,高電平led熄滅,高低電平的定義在之前的api中已經(jīng)介紹過了,是一個枚舉類型。
static IotGpioValue ledPin = IOT_GPIO_VALUE0;

//GPIO5的中斷處理函數(shù),當(dāng)我們點擊user按鈕時,系統(tǒng)的內(nèi)核就會暫停手頭的工作來執(zhí)行我們這里的中斷函數(shù)。
static void ButtonPressed(char* atgs){
    // 我們的業(yè)務(wù)邏輯是讓led熄滅點亮熄滅點亮,因此只需要修改上方我們定義的ledPin值即可
    if(ledPin == IOT_GPIO_VALUE0){
        ledPin = IOT_GPIO_VALUE1;
    } else {
        ledPin = IOT_GPIO_VALUE0;
    }
    /**
     * 當(dāng)然看過源碼的你也可以簡寫成:
     * ledPin = !ledPin;
    */
}

// 主函數(shù)
static void GpioInitMain(void){
    // 在主函數(shù)中我們通常完成一些GPIO的注冊和設(shè)置,主要就是用一些介紹給大家的API即可

    // GPIO初始化 ——> IoTGpioInit 接口
    IoTGpioInit(LED_GPIO);
    IoTGpioInit(BUTTON_GPIO);

    // 設(shè)置引腳的功能,因為hi3861的引腳數(shù)少,一個引腳上集成了很多功能,需要我們手動設(shè)置,選擇其中的一項功能
    hi_io_set_func(LED_GPIO, HI_IO_FUNC_GPIO_9_GPIO);
    hi_io_set_func(BUTTON_GPIO, HI_IO_FUNC_GPIO_5_GPIO);

    // 設(shè)置GPIO的輸入輸出模式 led為輸出模式,button為輸入模式
    IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BUTTON_GPIO, IOT_GPIO_DIR_IN);

    // 設(shè)置GPIO5為上拉模式
    hi_io_set_pull(BUTTON_GPIO, HI_IO_PULL_UP);

    // 注冊中斷函數(shù)
    IoTGpioRegisterIsrFunc(BUTTON_GPIO, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, ButtonPressed, NULL);

    // 循環(huán)設(shè)置led的電平
    while(1){
        IoTGpioSetOutputVal(LED_GPIO, ledPin);
        osDelay(10);
    }
}

// 測試入口
static void GpioTest(void){
    // 創(chuàng)建線程,大家還記得怎么創(chuàng)建的嗎
    osThreadAttr_t attr = {"GpioInitMain", 0, NULL, 0, NULL, 1024, osPriorityNormal, 0, 0};
    osThreadNew((osThreadFunc_t)GpioInitMain, NULL, &attr);
}

APP_FEATURE_INIT(GpioTest);
  1. 編寫B(tài)IULD.gn文件。
static_library("led_gpio_demo"){
    sources = [
        "ledGpio.c"
    ]
    include_dirs = [
        "http://commonlibrary/utils_lite/include/",
        "http://device/soc/hisilicon/hi3861v100/hi3861_adapter/kal/cmsis",
        "http://base/iothardware/peripheral/interfaces/inner_api",
        "http://device/soc/hisilicon/hi3861v100/sdk_liteos/include/"
    ]
}
  1. 編寫app目錄下的BUILD.gn文件。

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

  1. 編譯,燒錄。
  2. 重啟開發(fā)板,點擊user按鈕,觀察可編程led的狀態(tài)。

PWM

除了GPIO外,我們還可以通過PWM進行外部設(shè)備的控制,PWM是一種脈沖調(diào)制技術(shù),用于控制數(shù)字系統(tǒng)中的模擬信號。通過改變信號的占空比,PWM可以模擬出不同的電壓或電流值。在PWM信號中,周期固定,但高電平和低電平的持續(xù)時間可以不同。例如,一個50%的占空比意味著高電平和低電平各占一個周期的一半時間。當(dāng)占空比增加時,高電平的持續(xù)時間增加,低電平的持續(xù)時間減少,平均輸出功率也相應(yīng)增加。因此,我們還可以用PWM控制led的亮度,因為占空比會直接影響輸出的功率,功率會影響燈的亮度,算是中學(xué)物理了。廣泛應(yīng)用于電機控制、LED調(diào)光、音頻生成等。

占空比與燈泡亮度

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

總結(jié)

PWM有兩個重要的參數(shù),第一個是輸出頻率,頻率越高,則模擬的效果越好;第二個是占空比,占空比就是改變輸出模擬效果的電壓大小,占空比越大則模擬出的電壓越大。

PWM-API

很多基礎(chǔ)的IoT接口都已經(jīng)在GPIO-API上講到了,這里的介紹就相對簡單一點。

  1. 初始化PWM。
unsigned int IoTPwmInit(unsigned int port);

通過參數(shù)port,指定PWM的端口號。

  1. 啟用PWM。
unsigned int IoTPwmStart(unsigned int port, unsigned short duty, unsigned int freq);

參數(shù)解釋:

  • port:PWM的端口號
  • duty:PWM輸出的占空比
  • freq:PWM輸出的頻率
  1. 停止PWM。
unsigned int IoTPwmStop(unsigned int port);

通過參數(shù)port,停止PWM的輸出。

結(jié)合GPIO和PWM我們已經(jīng)可以去控制一些板子了,就不單獨設(shè)計PWM的案例了。

交通燈板的控制

交通燈板上一共有3個小板塊,紅綠燈,蜂鳴器,按鈕。下面逐個為大家講解如何使用對應(yīng)的API去控制他們。(涉及 GPIO控制設(shè)備和中斷函數(shù)處理 )

按鈕控制蜂鳴器

按一下按鈕,蜂鳴器鳴叫3秒。

  1. 新建樣例目錄。
    applications/sample/wifi-iot/app/pwm_out_demo
  2. 新建源文件和gn文件。
    applications/sample/wifi-iot/app/pwm_out_demo/pwm.c
    applications/sample/wifi-iot/app/pwm_out_demo/BUILD.gn
  3. 編寫源文件,pwm.c。
#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_io.h"
#include "iot_gpio.h"
// pwm接口
#include "iot_pwm.h"
#include "hi_pwm.h"

#define BUTTON_GPIO 8
#define BEE_GPIO 9

static int flag = 0;

// GPIO8中斷函數(shù)
static void ButtonPressed(char* atgs){
    // 業(yè)務(wù)邏輯是讓蜂鳴器響三秒
    if(flag == 0){
        flag = 1;
    }
}

// 主線程函數(shù)
static void PwmInitMain(void){
    // 初始化GPIO模塊
    IoTGpioInit(BUTTON_GPIO);
    IoTGpioInit(BEE_GPIO);

    // 設(shè)置引腳功能
    hi_io_set_func(BEE_GPIO, HI_IO_FUNC_GPIO_9_PWM0_OUT);
    hi_io_set_func(BUTTON_GPIO, HI_IO_FUNC_GPIO_8_GPIO);

    // 設(shè)置GPIO輸出模式
    IoTGpioSetDir(BEE_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BUTTON_GPIO, IOT_GPIO_DIR_IN);

    // 設(shè)置引腳上拉
    hi_io_set_pull(BUTTON_GPIO, HI_IO_PULL_UP);

    // 注冊中斷函數(shù)
    IoTGpioRegisterIsrFunc(BUTTON_GPIO, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, ButtonPressed, NULL);

    // 循環(huán)監(jiān)聽flag,當(dāng)按鈕被按下時,flag會置為1,蜂鳴器工作3秒
    while(1){

        if(flag){
            // 初始化PWM模塊
            IoTPwmInit(HI_PWM_PORT_PWM0);

            // 設(shè)置信號輸出, 端口,占空比,頻率
            IoTPwmStart(HI_PWM_PORT_PWM0, 50, 4000);

            // 鳴3秒
            osDelay(300);

            // 停止信號輸出
            IoTPwmStop(HI_PWM_PORT_PWM0);
            flag = 0;
        }
        osDelay(100);
    }
}

// 測試入口
static void PwmTest(void){
    osThreadAttr_t attr = {"GpioInitMain", 0, NULL, 0, NULL, 1024, osPriorityNormal, 0, 0};
    osThreadNew((osThreadFunc_t)PwmInitMain, NULL, &attr);
}

APP_FEATURE_INIT(PwmTest);
  1. 編寫B(tài)IULD.gn文件。
static_library("pwm_out_demo"){
    sources = [
        "pwm.c"
    ]
    include_dirs = [
        "http://commonlibrary/utils_lite/include/",
        "http://device/soc/hisilicon/hi3861v100/hi3861_adapter/kal/cmsis",
        "http://base/iothardware/peripheral/interfaces/inner_api",
        "http://device/soc/hisilicon/hi3861v100/sdk_liteos/include/"
    ]
}
  1. 編寫app目錄下的BUILD.gn文件。

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

  1. 編譯,燒錄。
  2. 重啟開發(fā)板,點擊s1按鈕,可以聽到蜂鳴器鳴叫。

按鈕切換紅綠燈

按一下按鈕,紅綠燈順次切換。

  1. 新建樣例目錄。
    applications/sample/wifi-iot/app/traffic_demo
  2. 新建源文件和gn文件。
    applications/sample/wifi-iot/app/traffic_demo/traffic.c
    applications/sample/wifi-iot/app/traffic_demo/BUILD.gn
  3. 編寫源文件,traffic.c。
#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_io.h"
#include "iot_gpio.h"

#define BUTTON_GPIO 8
#define RED_GPIO 10
#define GREEN_GPIO 11
#define YELLOW_GPIO 12

// 每個燈的引腳編號
static int lights[3] = {RED_GPIO, GREEN_GPIO, YELLOW_GPIO};
// 每個燈的狀態(tài)
static int lightsStauts[3] = {0, 0, 0};
// 燈的索引
static int lightsIndex = 0;

// 中斷函數(shù)
static void ButtonPress(char *args){
    // 點擊按鈕,要能夠切換紅綠燈,修改燈的狀態(tài)數(shù)組即可
    for(unsigned int i = 0; i < 3; i++){
        if(i == lightsIndex){
            lightsStauts[i] = 1;
        } else {
            lightsStauts[i] = 0;
        }
    }
    lightsIndex++;
    if(lightsIndex >= 3){
        lightsIndex = 0;
    }
}

// 主函數(shù)
static void TrafficInitMain(void){
    // GPIO初始化
    IoTGpioInit(BUTTON_GPIO);
    IoTGpioInit(RED_GPIO);
    IoTGpioInit(GREEN_GPIO);
    IoTGpioInit(YELLOW_GPIO);

    // GPIO功能設(shè)置
    hi_io_set_func(BUTTON_GPIO, HI_IO_FUNC_GPIO_8_GPIO);
    hi_io_set_func(RED_GPIO, HI_IO_FUNC_GPIO_10_GPIO);
    hi_io_set_func(GREEN_GPIO, HI_IO_FUNC_GPIO_11_GPIO);
    hi_io_set_func(YELLOW_GPIO, HI_IO_FUNC_GPIO_12_GPIO);
    
    // PGPIO輸入輸出設(shè)置
    IoTGpioSetDir(BUTTON_GPIO, IOT_GPIO_DIR_IN);
    IoTGpioSetDir(RED_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(GREEN_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(YELLOW_GPIO, IOT_GPIO_DIR_OUT);

    // 引腳上拉
    hi_io_set_pull(BUTTON_GPIO, HI_IO_PULL_UP);

    // 中斷回調(diào)函數(shù)注冊
    IoTGpioRegisterIsrFunc(BUTTON_GPIO, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, ButtonPress, NULL);
   
   while(1){
        // 設(shè)置輸出電平,即可控制燈的點亮熄滅,其實和之前控制led一樣,只不過這次一下控制3個,用數(shù)組而已
        for(unsigned int i = 0; i < 3; i++){
            IoTGpioSetOutputVal(lights[i], lightsStauts[i]);
        }
        osDelay(100);
   }
}

// 測試入口
static void TrafficTest(void){
    osThreadAttr_t attr = {"TrafficInitMain", 0, NULL, 0, NULL, 1024, osPriorityNormal, 0, 0};
    osThreadNew((osThreadFunc_t)TrafficInitMain, NULL, &attr);
}

APP_FEATURE_INIT(TrafficTest);
  1. 編寫B(tài)IULD.gn文件。
static_library("traffic_demo"){
    sources = [
        "traffic.c"
    ]
    include_dirs = [
        "http://commonlibrary/utils_lite/include/",
        "http://device/soc/hisilicon/hi3861v100/hi3861_adapter/kal/cmsis",
        "http://base/iothardware/peripheral/interfaces/inner_api",
        "http://device/soc/hisilicon/hi3861v100/sdk_liteos/include/"
    ]
}
  1. 編寫app目錄下的BUILD.gn文件。

OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·上]-開源基礎(chǔ)軟件社區(qū)

  1. 編譯,燒錄。
  2. 重啟開發(fā)板,點擊s1按鈕,可以看到紅綠燈正在切換。大家也可以修改代碼,實現(xiàn)有紅黃綠,綠黃紅那樣變化。

至此,交通燈板的三個小模塊就給大家介紹到這里,這些都是基本操作,僅在如何控制設(shè)備,與設(shè)備交互,大家可以根據(jù)自己的想法,創(chuàng)新一些業(yè)務(wù)邏輯,使用該功能板完成相應(yīng)的場景業(yè)務(wù)。

結(jié)束語

本片主要介紹了GPIO,PWM控制驅(qū)動的方案,并在交通燈板上進行了實際演示,以及三色燈的使用。后續(xù)的開發(fā)板硬件設(shè)備會在OpenHarmony智能開發(fā)套件[驅(qū)動開發(fā)篇·下]中詳細講解,包括人體紅外感應(yīng),光敏電阻,RGB燈效,溫濕度傳感器,oled屏幕的點亮。
[本來每一個案例后面都做了實際效果演示視頻的,但是視頻好像上傳不了,那暫時就沒有視頻演示了。]

想了解更多關(guān)于開源的內(nèi)容,請訪問:

51CTO 開源基礎(chǔ)軟件社區(qū)

https://ost.51cto.com

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-05-30 14:58:05

智能開發(fā)鴻蒙

2023-05-12 14:52:11

鴻蒙操作系統(tǒng)

2023-05-15 15:27:20

鴻蒙智能開發(fā)套件

2023-05-17 15:07:42

智能開發(fā)鴻蒙

2021-12-06 15:05:41

鴻蒙HarmonyOS應(yīng)用

2022-03-01 15:54:38

智能開發(fā)鴻蒙創(chuàng)造性TV

2021-11-12 15:58:11

鴻蒙HarmonyOS應(yīng)用

2009-02-27 09:07:09

Linux開發(fā)套件100美元

2022-04-01 15:26:06

Harmony操作系統(tǒng)鴻蒙

2022-03-03 19:21:50

Harmony鴻蒙操作系統(tǒng)

2023-10-27 06:33:14

鴻蒙開發(fā)套件

2010-01-22 09:40:36

Kindle平臺亞馬遜

2011-10-25 09:48:07

NFC諾基亞Symbian

2020-10-30 17:57:11

鴻蒙HiSpark

2013-08-07 09:45:35

Windows phoWP應(yīng)用開發(fā)套件Stu

2018-02-27 16:55:38

微軟量子開發(fā)

2023-10-06 11:09:23

微軟C#

2023-02-28 15:49:09

鴻蒙應(yīng)用開發(fā)

2020-10-23 09:50:15

HiSpark Wi-開發(fā)套件

2023-04-26 09:37:25

智駕開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲精品97久久中文字幕| 亚洲国产精品自拍视频| chinese偷拍一区二区三区| 久久久久久自在自线| 日韩欧美中文一区| 国内少妇毛片视频| 天天躁日日躁狠狠躁喷水| 国产亚洲永久域名| 伊是香蕉大人久久| 亚洲一区二区中文字幕在线观看| h片在线免费| 国产成人精品一区二| 国内揄拍国内精品| xxxx日本免费| 四虎国产精品免费久久5151| 亚洲精品一二三四区| 国产精品区二区三区日本| 国产情侣在线视频| 精品少妇av| 欧美一区二区精品在线| 996这里只有精品| 免费理论片在线观看播放老| 国内成人自拍视频| 97久久久免费福利网址| 欧美人妻一区二区三区| 成人h在线观看| 一区二区三区四区精品在线视频| 一区不卡在线观看| 欧美独立站高清久久| 欧美日韩国产成人在线免费| 日本a在线天堂| 日韩一区二区三区在线观看视频| 国产欧美91| 中文综合在线观看| 69亚洲乱人伦| 欧美黄色成人| 精品日韩视频在线观看| 欧美日韩亚洲免费| 国产手机精品视频| 日韩精品福利网| 欧美国产乱视频| 一区二区三区在线观看免费视频| 爱爱精品视频| 欧美欧美午夜aⅴ在线观看| 给我免费播放片在线观看| 91看片在线观看| 成人高清视频在线| 成人精品视频99在线观看免费| 亚洲一区欧美在线| 91欧美在线| 亚洲网站视频福利| 99精品一区二区三区无码吞精| 欧美一区=区三区| 五月天激情综合| 亚洲 日韩 国产第一区| 天堂在线中文| 成人激情免费电影网址| 成人春色激情网| 国产午夜无码视频在线观看| 亚洲日本欧美| 九九久久国产精品| www色aa色aawww| 国产亚洲一区| 精品一区电影国产| 国产二级一片内射视频播放| 精品午夜视频| 欧美人伦禁忌dvd放荡欲情| 三年中国国语在线播放免费| free性护士videos欧美| 亚洲欧美成aⅴ人在线观看| 亚洲啪啪av| 性xxxxbbbb| 99精品国产热久久91蜜凸| 国产乱人伦精品一区二区| 亚洲精品国产suv一区| 狠狠色综合色综合网络| 国产精品入口免费视| 欧美 亚洲 另类 激情 另类 | 在线观看成人小视频| 欧美a在线视频| 高清在线视频不卡| 偷拍与自拍一区| 国产精品乱码视频| 国产高清免费av| 国产a视频精品免费观看| 国产高清不卡av| 免费黄网站在线观看| 国产精品二区一区二区aⅴ污介绍| 伊人久久av导航| 在线免费观看的av| 欧美日韩亚洲视频| 色多多视频在线播放| 欧美日韩中出| 日韩精品高清视频| 国产免费嫩草影院| 国产精品成人一区二区网站软件| 91高清在线免费观看| 中文字字幕在线中文| 蜜桃视频一区二区三区| 91亚色免费| 四虎影视2018在线播放alocalhost| 久久精子c满五个校花| 国产盗摄视频在线观看| 国产夫妻在线播放| 欧美日韩国产系列| www国产视频| 久久香蕉国产| 91精品国产高清久久久久久91| 在线视频 91| 本田岬高潮一区二区三区| 午夜一区二区三视频在线观看| 色图在线观看| 欧洲一区二区三区在线| 一级少妇精品久久久久久久| 色天天久久综合婷婷女18| 97精品一区二区三区| 国产内射老熟女aaaa∵| 久久久久久久综合色一本| 欧美做暖暖视频| 国产激情欧美| 亚洲精品视频免费在线观看| 国产大片免费看| 日韩二区在线观看| 精品国产乱码久久久久久丨区2区| 亚洲xxxxxx| 狠狠躁18三区二区一区| 亚洲av无码久久精品色欲| 免费毛片在线不卡| 欧美精品激情blacked18| 一本色道久久综合亚洲| 久久久久久日产精品| 狠狠干 狠狠操| 亚洲超碰在线观看| 日韩中文字幕在线看| 丰满少妇xoxoxo视频| 成人一区在线看| 亚洲小说欧美另类激情| 国产91欧美| 夜夜嗨av一区二区三区免费区 | 亚洲系列另类av| 久久久久久久久久久久久久久久久久av | 少妇性l交大片| 女人抽搐喷水高潮国产精品| 欧美国产日韩精品| 99热这里只有精| 亚洲天堂久久久久久久| 一区二区免费av| 欧美电影一区| 成人黄色免费看| 在线看av的网址| 欧美三级午夜理伦三级中视频| 中文字幕国产专区| 久久人人精品| 蜜桃传媒视频麻豆第一区免费观看| 丰乳肥臀在线| 亚洲成色777777女色窝| 在线看成人av| av电影在线观看完整版一区二区| 久久人人爽人人爽人人av| 韩国三级大全久久网站| 欧美插天视频在线播放| 99久久亚洲精品日本无码| 亚洲视频香蕉人妖| 激情图片中文字幕| 女同性一区二区三区人了人一| 亚洲自拍偷拍网址| 日本性爱视频在线观看| 日韩精品在线网站| 精品无码人妻一区二区三区 | 中出视频在线观看| 香蕉视频成人在线观看| 日韩精品大片| 欧洲午夜精品| 欧美激情一二区| 无码精品人妻一区二区三区影院| 欧美日韩日本国产| www亚洲色图| 精品亚洲国内自在自线福利| av中文字幕av| 精品国产影院| 国产成人精品综合久久久| 自拍视频在线播放| 日韩精品中文字幕一区二区三区| 日韩av在线天堂| 久久精品这里都是精品| 欧洲美女亚洲激情| 亚洲高清不卡| 日韩久久精品一区二区三区| 日韩一级特黄| 欧美精品久久久久久久免费观看| 日本不卡免费播放| 欧美日本视频在线| 久草网在线观看| 久久亚洲精华国产精华液| 亚洲精品午夜在线观看| 欧美激情视频一区二区三区免费| 精品日韩美女| 欧美三级电影网址| 久久免费视频网| 在线观看免费版| 亚洲精品一区二区三区精华液| 成人a v视频| 夜夜爽夜夜爽精品视频| 久久精品无码一区| 国产精品羞羞答答xxdd| 免费男同深夜夜行网站| 欧美日韩亚洲一区| 亚洲第一导航| 国内精品国产成人国产三级粉色| 国产精品狼人色视频一区| 韩国日本一区| 日韩在线视频免费观看| 天堂а√在线8种子蜜桃视频| 欧美老年两性高潮| 全部毛片永久免费看| 亚洲日本va午夜在线影院| 日本少妇高潮喷水xxxxxxx| 成人丝袜视频网| 激情五月婷婷基地| 老司机精品导航| 给我免费播放片在线观看| 99久久www免费| 欧美日韩精品久久| 激情小说亚洲色图| 99re在线视频观看| 欧洲午夜精品| 国产精品久久中文| 日韩天堂在线| 琪琪第一精品导航| а√在线中文在线新版| 欧美床上激情在线观看| 在线日本视频| 中文字幕国产亚洲| 国产精品一级伦理| 日韩精品免费在线观看| 成人小说亚洲一区二区三区| 欧美一级专区免费大片| 91福利在线观看视频| 欧美在线免费播放| 成人a v视频| 色综合久久中文综合久久97| 在线观看亚洲欧美| 性久久久久久久久久久久| 免费一级肉体全黄毛片| 亚洲激情图片qvod| 久久久国产精华液| 一区二区三区不卡视频| 九九热精品免费视频| 亚洲男人天堂av| 国产一二三四区| 亚洲色欲色欲www| 日韩视频中文字幕在线观看| 亚洲人亚洲人成电影网站色| 99久久婷婷国产综合| 亚洲国产高清aⅴ视频| 亚洲欧美va天堂人熟伦| 日本一区二区动态图| 九九热免费在线| 国产精品女人毛片| 秋霞欧美一区二区三区视频免费| 亚洲色图视频网站| 欧美日韩大片在线观看| 亚洲高清中文字幕| 亚洲男人的天堂在线视频| 欧美色播在线播放| 欧美超碰在线观看| 欧美体内she精视频| 97超碰中文字幕| 日韩免费高清av| 黄色av免费观看| 亚洲美女久久久| 国产对白叫床清晰在线播放| 日韩一区二区三区在线播放| 最新超碰在线| 97精品视频在线观看| 91国内外精品自在线播放| 国产综合色香蕉精品| 2020国产精品极品色在线观看| 国产欧美韩日| 国产一区毛片| 亚洲免费av网| 亚洲激情自拍| 欧美大尺度做爰床戏| 国产福利一区在线观看| 中文字幕丰满孑伦无码专区| 国产精品无人区| 久久精品www人人爽人人| 欧美视频在线免费看| 一级黄色大片免费| 精品国产第一区二区三区观看体验| 天天躁日日躁狠狠躁喷水| 在线观看欧美日韩国产| av软件在线观看| 欧美怡春院一区二区三区| 精品久久福利| 国产欧美综合精品一区二区| 成人同人动漫免费观看 | 中文日本在线观看| 青青草综合网| 麻豆亚洲一区| 亚洲欧美综合久久久| 久久视频这里有精品| 久久激情综合网| 国产精品300页| 亚洲欧洲另类国产综合| 国产专区第一页| 91精品国产免费| 黄色av网址在线免费观看| 欧美精品在线看| 欧美精品高清| 国产精品免费一区二区三区观看 | 精品国产乱子伦一区| 成黄免费在线| 97香蕉久久超级碰碰高清版| 婷婷久久免费视频| 欧美日韩喷水| 亚洲二区免费| 亚欧美一区二区三区| 国产精品污网站| 国产美女激情视频| 日韩西西人体444www| 素人av在线| 国产精品mp4| 日韩高清电影免费| 老司机激情视频| 国模少妇一区二区三区| 国产真人做爰视频免费| 婷婷开心激情综合| 亚洲爱情岛论坛永久| 久久精品人人爽| 成人在线观看免费播放| 欧美伦理一区二区| 99亚洲一区二区| 亚洲精品国产成人av在线| 一区二区免费在线| 国产av无码专区亚洲av麻豆| 日韩在线视频观看正片免费网站| 播放一区二区| 日韩av不卡在线播放| 校园春色综合网| 中文字幕一区二区人妻在线不卡 | 丰满少妇xoxoxo视频| 亚洲激情成人网| а√天堂8资源中文在线| 国产精品嫩草在线观看| 亚洲高清久久| 欧美肉大捧一进一出免费视频 | 日韩国产精品一区| www.色在线| 精品欧美一区二区久久久伦| 在线视频精品| 蜜臀av一区二区三区有限公司| 欧美日韩免费在线| 噜噜噜噜噜在线视频| 国产成人综合久久| 成人免费看片39| 57pao国产成永久免费视频| 中文字幕在线不卡国产视频| 国产精品久久免费| 欧美成人精品不卡视频在线观看| 欧美久久一区二区三区| 大陆av在线播放| 成人av电影在线播放| 可以免费在线观看的av| 亚洲欧美在线磁力| 秋霞国产精品| 自拍偷拍一区二区三区| 国产91精品入口| 国产微拍精品一区| 在线观看成人黄色| 成人综合日日夜夜| 亚洲 自拍 另类小说综合图区| 2欧美一区二区三区在线观看视频| 欧美日韩a v| 久久人人爽人人爽人人片亚洲| 日本99精品| 久久久久久久午夜| 国产三级精品在线| 97人妻精品一区二区三区动漫| 久久不射电影网| 中文在线综合| 无码无遮挡又大又爽又黄的视频| 国产精品麻豆久久久| 性网爆门事件集合av| 欧美亚洲激情在线| 日韩伦理一区| 特黄特色免费视频| 一本色道久久加勒比精品| 色网站免费在线观看| 国产精品一区二区三区在线观| 久久久久网站| 久久久精品视频免费观看| 亚洲精品久久久久久久久| 六九午夜精品视频| 日韩国产欧美亚洲| 中文字幕在线一区二区三区| 手机看片福利在线| 国产中文字幕91| 久久国产直播| 精品97人妻无码中文永久在线|