精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

欧美国产极品| 秋霞在线视频| 国产一区二区三区视频在线播放| 九九久久精品一区| 国产又粗又长又爽| 成人在线爆射| 亚洲黄网站在线观看| 精品国产乱码久久久久软件| 中文字幕日韩国产| 欧美涩涩视频| 国产午夜精品一区二区三区| 亚洲视频在线不卡| 中文字幕乱码中文乱码51精品| 国产精品久久久久久亚洲伦| 国产精品久久久对白| 欧美激情一区二区三区免费观看 | 国产成人精品综合在线观看| 欧美影院在线播放| 中文字幕av免费在线观看| 国产成人精品三级高清久久91| 日韩欧美久久一区| 中文字幕国产传媒| 激情黄产视频在线免费观看| 中文字幕一区免费在线观看| 乱一区二区三区在线播放| 91成人国产综合久久精品| 亚洲一区观看| 欧美激情视频在线观看| 少妇高潮惨叫久久久久| 亚洲图区在线| 亚洲国产高潮在线观看| 超碰在线免费av| 99久久婷婷国产综合精品首页| 亚洲一区影音先锋| 97精品国产97久久久久久粉红| 久久久久久久久亚洲精品| 国产经典欧美精品| 成人性生交大片免费看视频直播 | 国产精品免费精品自在线观看| 欧美日韩国产一区在线| 日本一级黄视频| 美女羞羞视频在线观看| 国产三级三级三级精品8ⅰ区| 黄色一区三区| 欧美亚洲精品在线观看| 国产成人在线看| 亚洲va欧美va国产综合剧情 | 麻豆国产精品一区二区三区| 欧美重口另类videos人妖| 日本特黄特色aaa大片免费| 欧美在线不卡| 久久夜精品香蕉| 国产小视频你懂的| 99国内精品久久久久久久| 一区国产精品视频| 成人在线观看免费高清| 精品久久一区| 伊人久久大香线蕉av一区二区| 大又大又粗又硬又爽少妇毛片 | 亚洲一区二区三区涩| wwwww在线观看免费视频| 久久精品免费在线观看| 日本公妇乱淫免费视频一区三区| 国产在线一在线二| 中文字幕精品一区二区三区精品| 午夜精品短视频| 香蕉视频在线播放| 亚洲三级电影全部在线观看高清| 国产精品88久久久久久妇女| 天堂av中文在线| 亚洲va欧美va国产va天堂影院| 天天夜碰日日摸日日澡性色av| 国产中文在线播放| 色国产综合视频| 亚洲色成人一区二区三区小说| 在线国产成人影院| 欧美日韩国产中文| 欧美一区二区三区影院| 99精品在免费线中文字幕网站一区| 亚洲成成品网站| 国产精品探花一区二区在线观看| 自拍视频一区| 久久天天躁狠狠躁夜夜躁| 四虎影院中文字幕| 欧美特黄a级高清免费大片a级| 91精品国产乱码久久久久久久久| 日本a级c片免费看三区| 美国毛片一区二区三区| 亚洲综合中文字幕在线| 人妻中文字幕一区| 国产嫩草影院久久久久| 公共露出暴露狂另类av| 国产va在线视频| 精品视频资源站| 美女露出粉嫩尿囗让男人桶| 久久99青青| 操91在线视频| 四虎成人在线观看| 国产老妇另类xxxxx| 久久精品五月婷婷| 老司机福利在线视频| 午夜精品久久久久久久| www.com操| 美女扒开腿让男人桶爽久久动漫| 在线播放日韩av| 久久精品视频国产| 美腿丝袜亚洲一区| 精品国产二区在线| 久操视频在线观看| 午夜不卡在线视频| 日本精品一区在线| 欧美禁忌电影网| 欧美丰满少妇xxxx| 91福利免费视频| 91网页版在线| 国产又粗又猛又爽又黄的网站| 电影一区电影二区| 亚洲国产成人精品久久久国产成人一区 | 欧美国产精品人人做人人爱| 成人黄色三级视频| 99久精品国产| 大荫蒂性生交片| 日韩伦理一区二区| 亚洲欧美资源在线| 日韩免费视频网站| 国产成人福利片| 日韩视频在线免费播放| japanese23hdxxxx日韩| 日韩成人在线电影网| 欧美日韩一级大片| 精品一区二区成人精品| 亚洲一区二区在线看| 欧美色网一区| 日韩国产精品一区| 日本在线视频免费观看| 国产不卡一区视频| 一级全黄肉体裸体全过程| 久久亚洲精品中文字幕| 国产亚洲成av人片在线观看桃| 国产尤物在线视频| av一本久道久久综合久久鬼色| 天天想你在线观看完整版电影免费| av日韩一区| 精品国产一区av| 亚洲熟女乱色一区二区三区久久久| 国产亚洲欧美激情| 日本中文字幕片| 妖精一区二区三区精品视频| 日产精品久久久一区二区福利| 午夜性色福利影院| 欧美日韩精品二区| 国产精品一级黄片| 欧美亚洲一区二区三区| 蜜桃成人免费视频| 日韩成人av电影| 国产亚洲精品久久久久久777| 中文精品久久久久人妻不卡| 国产精品久久久久影院| 亚洲在线观看网站| 亚洲天天综合| 国产精品swag| 天堂av在线网| 中文字幕亚洲无线码a| 91精品中文字幕| 亚洲欧美日韩成人高清在线一区| 日本成人在线免费| 国产精品日韩| 日本一区二区精品| 台湾天天综合人成在线| 欧美成人午夜剧场免费观看| 男人天堂手机在线观看| 黑丝美女久久久| 美女av免费看| 国产不卡高清在线观看视频| 男人用嘴添女人下身免费视频| 精品国产99| 91免费人成网站在线观看18| 波多野结衣中文字幕久久| 亚洲欧美国内爽妇网| 一区二区www| 亚洲高清免费观看| 欧美老熟妇乱大交xxxxx| 麻豆极品一区二区三区| 国产天堂视频在线观看| 一本久久青青| 91久久精品一区| yellow字幕网在线| 中文字幕国内精品| www久久久com| 在线视频你懂得一区| 欧洲第一无人区观看| 91在线视频播放地址| 亚洲欧美偷拍另类| 亚洲伦伦在线| 在线观看成人一级片| 国产伦精品一区二区三区免费优势 | 国产精品99久久久久久久vr| 各处沟厕大尺度偷拍女厕嘘嘘| 91精品1区| 欧美精品在线一区| 亚洲精品在线播放| 国产成人精品视频| 国产福利在线免费观看| 中文字幕日韩欧美在线视频| 亚洲欧美激情国产综合久久久| 91福利社在线观看| 久久久久无码国产精品| 国产精品久久久久毛片软件| 亚洲综合自拍网| 国产69精品久久777的优势| 天天爽夜夜爽一区二区三区| 99热在线精品观看| 国产手机视频在线观看| 国产欧美日韩在线一区二区| 国产精品久久久久久久久久直播| 精品久久在线| 日产精品99久久久久久| 色多多在线观看| 久久99热精品| 老司机av在线免费看| 国产一区二区三区高清在线观看| 秋霞视频一区二区| 日韩午夜在线播放| 97人人爽人人爽人人爽| 日本高清免费不卡视频| 国产尤物在线视频| 亚洲国产精品一区二区www | 欧美啪啪一区| 中文字幕色一区二区| 日韩欧美网站| 日本一区二区三区四区在线观看| 日韩极品少妇| 国产亚洲情侣一区二区无| 91精品国产乱码久久久竹菊| 97人人模人人爽人人喊38tv| 在线视频cao| 欧洲永久精品大片ww免费漫画| 国产啊啊啊视频在线观看| 欧美老少做受xxxx高潮| a级网站在线播放| 久久中文字幕在线| 国产日产一区二区| 欧美超级乱淫片喷水| 黄色免费在线观看| zzijzzij亚洲日本成熟少妇| 日本三级在线视频| 色视频www在线播放国产成人| 在线免费av电影| 色99之美女主播在线视频| yiren22综合网成人| 在线不卡国产精品| 亚洲欧美视频一区二区| 中文字幕av一区中文字幕天堂| av电影在线观看一区二区三区| 中日韩美女免费视频网址在线观看 | 激情五月色综合国产精品| 欧美日韩在线精品| 清纯唯美日韩| 亚洲色图都市激情| 亚洲小说欧美另类社区| 91av资源网| 免费的成人av| 99中文字幕在线| 成人激情小说乱人伦| 国产精品无码网站| 久久精品视频一区二区三区| 日本女人性生活视频| 亚洲黄色小说网站| 97人人澡人人爽人人模亚洲| 色激情天天射综合网| 亚洲天堂网在线观看视频| 欧美一区欧美二区| 日本精品一区二区在线观看| 亚洲欧美日韩国产中文专区| 免费在线观看黄色| 欧美激情videoshd| 新版的欧美在线视频| 国产精品专区第二| 中文字幕一区二区三区中文字幕| 久久精品国产理论片免费| 青青草成人影院| 亚洲色成人www永久在线观看| 午夜亚洲激情| 午夜一级免费视频| 不卡的看片网站| 日本午夜精品视频| 亚洲成人免费电影| 做爰无遮挡三级| 精品久久国产老人久久综合| 懂色一区二区三区| 欧美国产精品va在线观看| 日韩高清不卡| 成人免费视频网站| 欧美一区二区性| 国产精品入口芒果| 青青草国产精品亚洲专区无| 一级黄色片毛片| 国产精品麻豆视频| 久久亚洲精品国产| 欧美一级欧美三级| 国产小视频福利在线| 欧美激情一区二区三区高清视频| 蜜桃视频成人m3u8| 国产乱码精品一区二区三区中文 | 狠狠色狠狠色综合婷婷tag| 特级西西444| 蜜桃av噜噜一区二区三区小说| 国模无码视频一区| 亚洲色图视频网| 91黑人精品一区二区三区| 欧美精品一区二区三区高清aⅴ| 欧美一级二级三级区| 欧美在线观看网址综合| 亚洲高清在线一区| 宅男一区二区三区| 久久综合激情| xxxxxx黄色| 亚洲一区二区三区国产| 国产强被迫伦姧在线观看无码| 亚洲欧洲高清在线| 日韩激情电影| 国产欧美一区二区在线播放| 亚洲欧美偷拍自拍| 污污网站免费观看| 亚洲国产精品黑人久久久| 日韩特级黄色片| 日韩av影片在线观看| 久久一卡二卡| 国产精品欧美日韩久久| 欧洲美女女同性互添| 国产成人77亚洲精品www| 国产.欧美.日韩| 91久久精品www人人做人人爽| 日本欧美高清| 免费网站永久免费观看| 国产综合久久久久影院| 日韩视频在线观看免费视频| 欧美性猛交xxxx乱大交3| 婷婷丁香花五月天| 国产精品免费久久| 嘿嘿视频在线观看| 色综合久久88色综合天天| 天天操天天干天天舔| 国内外成人免费激情在线视频网站| 视频一区日韩精品| 国产成人艳妇aa视频在线 | 欧美一级xxxx| 国产精品色在线观看| 中文字幕在线网址| 中文字幕欧美日韩va免费视频| 91欧美精品| 一本色道久久综合亚洲二区三区| 另类欧美日韩国产在线| 国产亚洲精品久久久久久豆腐| 91麻豆精品国产91久久久久久久久| 欧美jizz18性欧美| 亚洲free嫩bbb| 综合久久精品| 中文成人无字幕乱码精品区| 精品福利一区二区| 人人九九精品| 国产精品日韩在线| 国产精品99视频| 极品人妻一区二区| 午夜av电影一区| 免费观看成年在线视频网站| 国产精品专区一| 欧美在线看片| 亚洲av网址在线| 欧美性一级生活| av电影免费在线观看| 国产一区二区中文字幕免费看| 久久久久在线| 最新av电影网站| 亚洲国产精久久久久久久| 黑人巨大亚洲一区二区久 | 日本最新在线视频| av激情久久| 欧美一级播放| 亚洲伦理一区二区三区| 精品国产污污免费网站入口| 中文在线аv在线| 樱空桃在线播放| 99久久免费国产| 一级特黄色大片| 久久躁狠狠躁夜夜爽| 精品视频自拍| 欧美一级xxxx| 精品欧美aⅴ在线网站| а√天堂中文在线资源bt在线| 91gao视频| 久久婷婷激情| 精品在线视频免费| 中文字幕久久久av一区| 国产精品调教视频| 亚洲美女爱爱视频| 狠狠操狠狠色综合网| 超碰在线免费播放| 区一区二区三区中文字幕| 国产成人在线网站|