共用方式為


在高階應用程式中使用 GPI

重要

這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。

Azure Sphere 支援 GPIO(一般用途的輸入/輸出)。 GPIO 是積體電路上的可程式化數字針腳類型。 GPI 沒有預先定義的功能,而且應用程式可以自定義其行為。 GPI 的一些常見用途是變更硬體裝置的狀態、控制 LED,以及讀取交換器的狀態。

注意

本主題描述如何在高階應用程式中使用 GPO。 如需 RTApps 中 GPIO 使用的相關信息,請參閱 在即時可用的應用程式中 使用周邊。

Azure Sphere 高階應用程式可以藉由呼叫 Applibs GPIO API 來與 GPI 通訊。 GPIO_HighLevelApp範例示範如何在 MT3620 裝置上與 GPO 通訊。

GPIO 支援下列作業:

  • 讀取輸入
  • 將輸出設定為高或低
  • 輪詢 / 軟體中斷

GPIO 需求

與 GPIO 通訊的應用程式必須包含 GPIO 的適當標頭檔,並將 GPIO 設定新增至 應用程式指令清單

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

標頭檔

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

將 「path-to-your-target-hardware.h」 取代為硬體頭文件的路徑。

應用程式指令清單設定

應用程式指令清單中的 GPIO 設定會列出應用程式所存取的 GPO。 一次只能有一個應用程式使用 GPIO。 若要設定這些設定,請將功能新增 Gpio 至應用程式指令清單,然後將每個 GPIO 新增至功能。 Azure Sphere 應用程式指令清單 有更多詳細數據。

在您的程式代碼中,使用為硬體定義的常數來識別 GPO。 當您建置應用程式時,編譯程式會將這些值轉譯為原始值。

例如,以下是以 MT3620 參考開發板 (RDB) 為目標之應用程式的應用程式指令清單摘錄,並取得其三個 GPI(1、8 和 12):

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

下列摘錄顯示如何在以Avnet MT3620 入門套件為目標的應用程式中指定相同的 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,您必須將它開啟為輸出。 呼叫 GPIO_OpenAsOutput 以開啟 GPIO 並將它設定為輸出。 這會擷取 GPIO 作業的檔案描述元、設定 輸出模式和初始 。 當 GPIO 設定為輸出時,您可以寫入並讀取它。 如果 GPIO 設定為輸出,您必須先 關閉 它,才能將它設定為輸入。

輪詢 GPIO

當 GPIO 開啟時,您可以監視它是否有事件,例如按下按鈕。 若要這樣做,您必須設定定時器來輪詢 GPIO。 Azure Sphere 不支援 GPIO 的硬體中斷,因此您必須使用輪詢。 GPIO 範例示範如何輪詢 GPIO。

從 GPIO 讀取

若要從 GPIO 讀取,請呼叫 GPIO_GetValue

寫入 GPIO

若要寫入 GPIO,請呼叫 GPIO_SetValue

設定 GPIO 的磁碟驅動器強度

GPIO 針腳的磁碟驅動器強度是指用來驅動它的目前數量。 一般而言,目前的這個數量會設定為預設值。 不過,某些案例,例如更亮的 LED 或增加感測器的電源,需要調整特定 GPIO 針腳的磁碟驅動器強度。

若要設定磁碟驅動器強度,請先使用 gpiopin_request 結構來指定一或多個 GPIO 針腳的磁碟驅動器強度組態。 接下來,在IOCTL呼叫中傳遞 gpiopin_requestGPIO_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 函式 close()。

MT3620 支援

MT3620 晶元支援的 GPIO 功能列在 MT3620 支援狀態中。 MT3620 開發板使用者指南說明 MT3620 RDB 上的針腳配置和針腳功能。

Microsoft Azure Sphere SDK 安裝目錄中的 HardwareDefinitions 資料夾包含一般 Azure Sphere 開發板、模組和晶片的定義。 其中包含標頭和 JSON 檔案,這些檔案會定義 MT3620、MT3620 RDB 和其他 MT3620 硬體的主要介面。 HardwareDefinitions 資料夾的預設位置位於 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions Windows 和 /opt/azurespheresdk/HardwareDefinitions Linux 上。

GitHub 上的 Azure Sphere 範例存放庫包含標頭和 JSON 檔案,可定義 MT3620 晶片MT3620 RDB 的 SPI 主要介面,以及其他 MT3620 硬體。-->