상위 수준 애플리케이션에서 GPIO 사용

Azure Sphere는 GPIO(범용 입력/출력)를 지원합니다. GPIO는 통합 회로의 프로그래밍 가능한 디지털 핀 유형입니다. GPIO에는 미리 정의된 기능이 없으며 애플리케이션에서 해당 동작을 사용자 지정할 수 있습니다. GPI에 대한 몇 가지 일반적인 용도는 하드웨어 디바이스의 상태를 변경하고 LED를 제어하며 스위치 상태를 읽는 것입니다.

참고

이 항목에서는 상위 수준 애플리케이션에서 GPIO를 사용하는 방법을 설명합니다. RTApps에서 GPIO 사용에 대한 자세한 내용은 실시간 지원 애플리케이션에서 주변 장치 사용을 참조하세요.

Azure Sphere 상위 수준 애플리케이션은 Applibs GPIO API를 호출하여 GPI와 통신할 수 있습니다. 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 설정에는 애플리케이션에서 액세스하는 GPI가 나열됩니다. 한 번에 하나의 애플리케이션만 GPIO를 사용할 수 있습니다. 이러한 설정을 구성하려면 애플리케이션 매니페스트에 기능을 추가 Gpio 한 다음 각 GPIO를 기능에 추가합니다. Azure Sphere 애플리케이션 매니페스트 에는 자세한 내용이 있습니다.

코드에서 하드웨어에 대해 정의된 상수를 사용하여 GPIO를 식별합니다. 컴파일러는 앱을 빌드할 때 이러한 값을 원시 값으로 변환합니다.

예를 들어 MT3620 RDB(참조 개발 보드) 를 대상으로 하고 3개의 GPIO(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가 열려 있는 경우 단추 누르기와 같은 이벤트에 대해 모니터링할 수 있습니다. 이렇게 하려면 GPIO를 폴링하는 타이머를 설정해야 합니다. GPIO에 대한 하드웨어 인터럽트는 Azure Sphere에서 지원되지 않으므로 폴링을 사용해야 합니다. GPIO 샘플은 GPIO를 폴링하는 방법을 보여 줍니다.

GPIO에서 읽기

GPIO에서 읽으려면 GPIO_GetValue 호출합니다.

GPIO에 쓰기

GPIO에 쓰려면 GPIO_SetValue 호출합니다.

GPIO의 드라이브 강도 설정

GPIO 핀의 드라이브 강도는 드라이브에 사용되는 전류의 양을 나타냅니다. 일반적으로 이 양의 현재 는 기본값으로 설정됩니다. 그러나 더 밝은 LED 또는 센서에 대한 전원 증가와 같은 일부 시나리오에서는 특정 GPIO 핀에 대한 드라이브 강도를 조정해야 합니다.

드라이브 강도를 설정하려면 먼저 gpiopin_request 구조를 사용하여 하나 이상의 GPIO 핀에 대한 드라이브 강도 구성을 지정합니다. 다음으로 IOCTL 호출을 전달 gpiopin_request 하고 GPIO_SET_PIN_CONFIG_IOCTL .

다음 코드 조각은 구조체의 배열 gpiopin_request 에 지정된 lineoffsets 두 GPIO 핀의 드라이브 강도를 설정하는 방법을 보여 줍니다.

//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 개발 보드, 모듈 및 칩에 대한 정의가 포함되어 있습니다. 여기에는 다른 MT3620 하드웨어와 함께 MT3620, MT3620 RDB에 대한 master 인터페이스를 정의하는 헤더 및 JSON 파일이 포함되어 있습니다. HardwareDefinitions 폴더의 기본 위치는 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions Windows 및 /opt/azurespheresdk/HardwareDefinitions Linux에 있습니다.