在高階應用程式中使用 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 上。