Бөлісу құралы:


Использование GPIOs в высокоуровневых приложениях

Azure Sphere поддерживает GPIOs (входные и выходные данные общего назначения). GPIO — это тип программируемых цифровых контактов на интегральной схеме. GPIOs не имеют предопределенных функций, и их поведение может быть настроено приложением. Некоторые распространенные способы использования GPIOs — изменение состояния аппаратных устройств, управление светодиодными индикаторами и чтение состояния коммутаторов.

Примечание

В этом разделе описывается, как использовать GPIOs в высокоуровневом приложении. Сведения об использовании GPIO в RTApps см. в статье Использование периферийных устройств в приложении с поддержкой реального времени .

Высокоуровневые приложения Azure Sphere могут взаимодействовать с GPIOs, вызывая API Applibs GPIO. В примере GPIO_HighLevelApp показано, как взаимодействовать с GPIOS на устройстве MT3620.

Для GPIO поддерживаются следующие операции:

  • Входные данные для чтения
  • Задайте для выходных данных значение "Высокий" или "Низкий"
  • Опрос и прерывание программного обеспечения

Требования GPIO

Приложения, взаимодействующие с GPIOS, должны включать соответствующие файлы заголовков для GPIO и добавлять параметры GPIO в манифест приложения.

Все приложения должны задать целевое оборудование и включить соответствующий файл заголовка определения оборудования.

Файлы заголовков

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

Замените path-to-your-target-hardware.h путем к файлу заголовка для оборудования.

Параметры манифеста приложения

В параметрах GPIO в манифесте приложения перечислены объекты GPIOS, к которым обращается приложение. Одновременно только одно приложение может использовать GPIO. Чтобы настроить эти параметры, добавьте Gpio возможность в манифест приложения, а затем добавьте каждый GPIO в возможность. Манифест приложения Azure Sphere содержит дополнительные сведения.

В коде используйте константы, определенные для оборудования, для идентификации GPIOS. Компилятор преобразует эти значения в необработанные значения при сборке приложения.

Например, ниже приведен отрывок из манифеста приложения для приложения, которое предназначено для эталонной платформы разработки (RDB) MT3620 и получает три из своих GPIOs (1, 8 и 12):

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

В следующем фрагменте показано, как указать те же объекты GPIOS в приложении, которое предназначено для начального комплекта Avnet MT3620:

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

Открытие GPIO в качестве входных данных

Если вам нужно считывать данные из GPIO, но не записывать в него, его можно открыть в качестве входных данных. Вызовите GPIO_OpenAsInput , чтобы открыть GPIO и задать для него входные данные. При этом будет получен дескриптор файла для операций с GPIO. Вы можете считывать данные из GPIO, пока для него задано значение input, но не можете записывать в него данные. Если для GPIO задано значение входных данных, его необходимо закрыть , прежде чем можно будет задать для него выходные данные.

Открытие GPIO в качестве выходных данных

Если необходимо выполнить запись в GPIO, его необходимо открыть в качестве выходных данных. Вызовите GPIO_OpenAsOutput , чтобы открыть GPIO и задать для него выходные данные. Это позволит получить дескриптор файла для операций с GPIO, задать режим вывода и начальное значение. Если для GPIO задано значение выходных данных, вы можете выполнять запись в него и считывать из него. Если для GPIO задано значение выходных данных, необходимо закрыть его, прежде чем можно будет задать для него входные данные.

Опрос GPIO

Когда GPIO открыт, его можно отслеживать на наличие событий, таких как нажатие кнопки. Для этого необходимо настроить таймер для опроса GPIO. Аппаратные прерывания для GPIOs не поддерживаются в Azure Sphere, поэтому вам нужно использовать опрос. В примере GPIO показано, как опросить GPIO.

Чтение из GPIO

Чтобы считывать данные из GPIO, вызовите GPIO_GetValue.

Запись в GPIO

Чтобы выполнить запись в GPIO, вызовите GPIO_SetValue.

Настройка прочности диска GPIO

Прочность штифта GPIO относится к объему тока, используемого для его привода. Как правило, для этого значения текущего значения задается значение по умолчанию. Однако в некоторых сценариях, таких как более яркие светодиодные индикаторы или повышенная мощность датчиков, требуется настроить прочность диска для определенных контактов GPIO.

Чтобы задать прочность диска, сначала используйте структуру gpiopin_request , чтобы указать конфигурацию прочности диска для одного или нескольких контактов GPIO. Затем передайте gpiopin_request и GPIO_SET_PIN_CONFIG_IOCTL в вызове IOCTL.

В следующем фрагменте кода показано, как задать прочность диска для двух контактов GPIO, которые указаны в массиве lineoffsetsgpiopin_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

Поддерживаемые функции GPIO для микросхемы MT3620 перечислены в разделе Состояние поддержки MT3620. Руководство пользователя на доске разработки MT3620 описывает макет и функции закрепления в RDB MT3620.

Папка HardwareDefinitions в каталоге установки пакета SDK microsoft Azure Sphere содержит определения для общих плат разработки, модулей и микросхем Azure Sphere. Он содержит файлы заголовков и JSON, определяющие интерфейсы master для MT3620, MT3620 RDB, а также другого оборудования MT3620. Папка HardwareDefinitions по умолчанию находится C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions в Windows и /opt/azurespheresdk/HardwareDefinitions Linux.