고급 애플리케이션에서 GPIO 사용
Important
Azure Sphere(레거시) 설명서입니다. Azure Sphere(레거시)는 2027년 9월 27일에 사용 중지되며 사용자는 이 시간까지 Azure Sphere(통합)로 마이그레이션해야 합니다. TOC 위에 있는 버전 선택기를 사용하여 Azure Sphere(통합) 설명서를 볼 수 있습니다.
Azure Sphere는 GPIO(범용 입력/출력)를 지원합니다. GPIO는 통합 회로의 프로그래밍 가능한 디지털 핀 유형입니다. GPIO에는 미리 정의된 기능이 없고 애플리케이션에서 해당 동작을 사용자 지정할 수 있습니다. GPIO의 일반적인 용도는 하드웨어 디바이스의 상태를 변경하고 LED를 제어하며 스위치 상태를 읽는 것입니다.
참고 항목
이 항목에서는 상위 수준 애플리케이션에서 GPIO를 사용하는 방법을 설명합니다. RTApps에서 GPIO 사용에 대한 정보는 실시간 지원 애플리케이션에 주변 장치 사용을 참조하세요.
Azure Sphere 상위 수준 애플리케이션은 Applibs GPIO API를 호출하여 GPIO와 통신할 수 있습니다. GPIO_HighLevelApp 샘플은 MT3620 디바이스에서 GPIO와 통신하는 방법을 보여 줍니다.
GPIO에는 다음 작업이 지원됩니다.
- 입력 읽기
- 출력을 높음 또는 낮음으로 설정
- 폴링/소프트웨어 인터럽트
GPIO 요구 사항
GPIO와 통신하는 애플리케이션은 GPIO에 적합한 헤더 파일을 포함하고 애플리케이션 매니페스트에 GPIO 설정을 추가해야 합니다.
모든 애플리케이션은 대상 하드웨어를 설정하고 해당 하드웨어 정의 헤더 파일을 포함해야 합니다.
Header Files
#include <applibs/gpio.h>
#include "path-to-your-target-hardware.h"
"path-to-your-target-hardware.h"를 하드웨어의 헤더 파일 경로로 바꿉니다.
애플리케이션 매니페스트 설정
애플리케이션 매니페스트의 GPIO 설정에는 애플리케이션에서 액세스할 수 있는 GPIO가 나열됩니다. 한 번에 하나의 애플리케이션만 GPIO를 사용할 수 있습니다. 이러한 설정을 구성하려면 애플리케이션 매니페스트에 Gpio
기능을 추가한 후 이 기능에 각 GPIO를 추가합니다. Azure Sphere 애플리케이션 매니페스트 에는 자세한 내용이 있습니다.
코드에서 하드웨어에 대해 정의된 상수로 GPIO를 식별합니다. 컴파일러는 앱을 빌드할 때 이러한 값을 원시 값으로 변환합니다.
예를 들어 다음은 MT3620 RDB(참조 개발 보드)를 대상으로 하고 3개의 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를 닫아야 합니다.
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에 대한 마스터 인터페이스를 정의하는 헤더 및 JSON 파일이 포함되어 있습니다. HardwareDefinitions 폴더의 기본 위치는 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
Windows 및 /opt/azurespheresdk/HardwareDefinitions
Linux에 있습니다.
GitHub의 Azure Sphere 샘플 리포지토리에는 다른 MT3620 하드웨어와 함께 MT3620 칩 및 MT3620 RDB에 대한 SPI 마스터 인터페이스를 정의하는 헤더 및 JSON 파일이 포함되어 있습니다.>