在高階應用程式中使用 GPIO

Azure 球體支援 GPIO (一般用途的輸入/輸出) 。 GPIO 是整合回路上一種可程式化的數位 PIN 碼類型。 GPIO 沒有預先定義的功能,它們的行為可以由應用程式自訂。 GPIO 的一些常見用途是變更硬體裝置的狀態、控制 LED,以及讀取切換狀態。

注意

本主題說明如何在高階應用程式中使用 GPIO。 如需 RTApps 中 GPIO 使用的相關資訊,請參閱 在支援即時的應用程式中使用介面 設備。

Azure 球體高層級應用程式可以呼叫 Applibs GPIO API來與 GPIO 通訊。 GPIO_HighLevelApp範例示範如何在 MT3620 裝置上與 GPIO 通訊。

GPIO 支援下列作業:

  • 朗讀輸入
  • 將輸出設為高或低
  • 投票 /軟體插斷

GPIO 需求

與 GPIO 通訊的應用程式必須包含適用于 GPIO 的適當頁首檔案,並將 GPIO 設定新增至 應用程式資訊清單

所有應用程式都必須 設定其目標硬體 ,並包含對應的硬體定義頁首檔案。

頁首檔案

 #include <applibs/gpio.h>
 #include "path-to-your-target-hardware.h"

將「path-to-your-target-hardware.h」取代為硬體頁首檔案的路徑。

應用程式資訊清單設定

應用程式資訊清單中的 GPIO 設定會列出應用程式存取的 GPIO。 一次只能使用一個 GPIO。 若要設定這些設定,請將該 Gpio 功能新增至應用程式資訊清單,然後將每個 GPIO 新增至該功能。 Azure 球體應用程式資訊清單 有更多詳細資料。

在程式碼中,使用為硬體定義的常數來識別 GPIO。 當您建立應用程式時,編譯器會將這些值翻譯成原始值。

例如,以下是針對針對 MT3620 參考開發面板 (RDB) 並取得其 GPIO (1、8 和 12) 之三的應用程式資訊清單摘要:

"Gpio": [ "$MT3620_RDB_HEADER1_PIN6_GPIO", "$MT3620_RDB_LED1_RED", "$MT3620_RDB_BUTTON_A" ]

下列摘要說明如何在針對 Avnet MT3620 Starter Kit的應用程式中指定相同的 GPIO:

"Gpio": [ "$AVNET_MT3620_SK_GPIO1", "$AVNET_MT3620_SK_USER_LED_RED", "$AVNET_MT3620_SK_USER_BUTTON_A" ]

開啟 GPIO 做為輸入

如果您需要從 GPIO 中閱讀,但無法寫入,您可以將它開啟為輸入。 撥 號GPIO_OpenAsInput 以開啟 GPIO 並將它設定為輸入。 這會擷取在 GPIO 上執行作業的檔案描述。 當 GPIO 設為輸入時,您可以從中讀取,但無法寫入。 如果 GPIO 設定為輸入,您必須 先將它關閉 ,才能將它設定為輸出。

以輸出方式開啟 GPIO

如果您需要寫入 GPIO,您必須將它開啟為輸出。 致電 GPIO_OpenAsOutput 以開啟 GPIO 並設定為輸出。 這會擷取在 GPIO 上作業的檔案描述器、設定 輸出模式和初始 。 當 GPIO 設定為輸出時,您可以寫入並從中讀取。 如果 GPIO 設為輸出,您必須 先將它關閉 ,才能將其設定為輸入。

對 GPIO 進行投票

當 GPIO 開啟時,您可以監視事件,例如按下按鈕。 若要這樣做,您必須設定計時器來投票 GPIO。 Azure 球體不支援 GPIO 的硬體中斷,因此您必須使用投票功能。 GPIO 範例示範如何對 GPIO 進行投票。

從 GPIO 讀取

若要從 GPIO 讀取,請連 絡GPIO_GetValue

寫入 GPIO

若要寫入 GPIO,請連 絡GPIO_SetValue

設定 GPIO 的磁片磁碟機強度

GPIO 圖釘的磁片磁碟機強度是指目前用來將它硬碟的磁片磁碟機數量。 一般說來,此數量的目前值會設為預設值。 不過,有些情況,例如 LED 變亮或感應器的電源增加,需要將磁片磁碟機強度調整為特定的 GPIO PIN 碼。

若要設定磁片磁碟機強度,請先使用 gpiopin_request 結構來指定一或多個 GPIO PIN 碼的磁片磁碟機強度設定。 接下來,在 gpiopin_request次的一次GPIO_SET_PIN_CONFIG_IOCTL通話中傳遞和GPIO_SET_PIN_CONFIG_IOCTL。

下列程式碼片段示範如何設定結構陣列中 lineoffsets 指定之兩個 GPIO 圖釘的 gpiopin_request 磁片磁碟機強度。

//get chip file descriptor
int chipfd = __z_azsp_open("/dev/gpiochip0", O_CLOEXEC);

//set drive strength for the requested pins
struct gpiopin_request pinreq;
memset(&pinreq, 0, sizeof(pinreq));
pinreq.linecount = 2;
pinreq.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
pinreq.lineoffsets[1] = SAMPLE_RGBLED_RED;
pinreq.config_type = PIN_CONFIG_DRIVE_STRENGTH;
pinreq.config_arg = 16;

result = ioctl(chipfd, GPIO_SET_PIN_CONFIG_IOCTL, &pinreq);
if (result < 0) {
    close(chipfd);
    return -1;
}

//do other work like setting pins as output
struct gpiohandle_request request;
memset(&request, 0, sizeof(request));
request.flags = GPIOHANDLE_REQUEST_OUTPUT;
request.lines = 2;
request.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
request.lineoffsets[1] = SAMPLE_RGBLED_RED;
request.default_values[0] = 1;
request.default_values[1] = 1;

result = ioctl(chipfd, GPIO_GET_LINEHANDLE_IOCTL, &request);
if (result < 0) {
    close(chipfd);
    return -1;
}

關閉 GPIO

若要關閉 GPIO,請呼叫 POSIX 函數關閉 () 。

MT3620 支援

MT3620 晶片支援的 GPIO 功能列在 MT3620 支援狀態中。 MT3620 開發面板使用者指南說明 MT3620 RDB 上的釘選版面配置和釘選功能。

Microsoft Azure 球體 SDK 安裝目錄中的 [HardwareDefinitions] 資料夾包含常見 Azure 球體開發面板、模組和晶片的定義。 它包含可定義 MT3620、MT3620 RDB 主介面以及其他 MT3620 硬體的頁首和 JSON 檔案。 HardwareDefinitions 資料夾的預設位置是在 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions Windows 和 /opt/azurespheresdk/HardwareDefinitions Linux 上。