ПРЕДУПРЕЖДЕНИЕ
Для работы с функциями библиотеки подключите ее в Вашу программу с помощью инструкции #include <event_gpio.h>
К СВЕДЕНИЮ
При использовании функций для работы с прерываниями необходимо учитывать следующие особенности:
-
Режим подтяжки: Драйвер GPIO может некорректно обрабатывать прерывания для входов, использующих внутренние подтягивающие «вниз» резисторы (режим
INPUT_PULLDOWN). Это связано с аппаратными особенностями SoC Allwinner. Для стабильной работы прерываний рекомендуется использовать режимINPUT(без подтяжки) илиINPUT_PULLUP. -
Аппаратные ограничения портов: В SoC Allwinner H5 (Repka Pi 3) и Allwinner H6 (Repka Pi 4) отсутствует аппаратная поддержка прерываний для контактов порта PC. Попытка настроить прерывание на этих пинах не будет успешной. Остальные порты (PA, PD, PF, PG, PH, PL, PM) поддерживают прерывания в штатном режиме.
-
Права доступа: для работы с прерываниями через стандартный интерфейс ядра Linux требуются права на чтение/запись для символьных устройств
/dev/gpiochip*.
ВАЖНО
Для Repka Pi5 аппаратные ограничения портов отсутствуют, все контакты GPIO-разъема работают в штатном режиме
interruptCreate() #
Инициализирует функцию обработки прерываний для указанного контакта GPIO-разъема.
Синтаксис #
int interruptCreate(int pin, void(*callback)(__u32, __u64))
Параметры #
pin - номер контакта GPIO-разъема.
void(*callback)(__u32, __u64) - пользовательская функция-обработчик события изменения уровня логического сигнала на контакте pin.
Возвращаемое значение #
0 при успешном выполнении или отрицательное значение в случае ошибки.
interruptStop() #
Завершает обработку прерываний для указанного контакта GPIO-разъема.
Синтаксис #
void interruptStop(int pin)
Параметры #
pin - номер контакта GPIO-разъема.
Возвращаемое значеие #
Ничего.
interruptStopAll() #
Завершает обработку прерываний для всех контактов GPIO-разъема, инициализированных с помощью interruptCreate
Синтаксис #
void interruptStopAll(void)
Параметры #
Ничего.
Возвращаемое значение #
Ничего.
Пример работы с прерываниями #
Пример включает светодиод при нажатии кнопки.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "wiringRP.h"
#include "event_gpio.h"
// Глобальные переменные и константы
const int LED = 8; // Светодиод. Контакт PA8 GPIO-разъема
const int BUTTON = 10; // Кнопка. Контакт PA10 GPIO-разъема
bool LED_ON = false;
// Объявление функции-обработчика события нажатия кнопки
void pushButtonEvent(__u32 event, __u64 time);
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(LED, OUTPUT) < 0 ||
pinMode(BUTTON, INPUT_PULLDOWN) < 0
) {
goto error;
}
if (interruptCreate(BUTTON, pushButtonEvent) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void pushButtonEvent(__u32 event, __u64 time) {
printf("Состояние кнопки - %s, временная отметка: %lld\n", event == 1 ? "Нажата" : "Отжата", time);
delay(100);
// Если кнопка нажата - переключаем светодиод
if (event && digitalRead(BUTTON)) {
LED_ON = !LED_ON;
}
}
void loop() {
// Основной цикл программы
if (LED_ON) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
interruptStopAll();
digitalWrite(LED, LOW);
pinMode(LED, DISABLE);
pinMode(BUTTON, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "wiringRP.h"
#include "event_gpio.h"
// Глобальные переменные и константы
const int LED = 111; // Светодиод. Контакт PD15 GPIO-разъема
const int BUTTON = 113; // Кнопка. Контакт PD17 GPIO-разъема
bool LED_ON = false;
// Объявление функции-обработчика события нажатия кнопки
void pushButtonEvent(__u32 event, __u64 time);
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(LED, OUTPUT) < 0 ||
pinMode(BUTTON, INPUT_PULLDOWN) < 0
) {
goto error;
}
if (interruptCreate(BUTTON, pushButtonEvent) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void pushButtonEvent(__u32 event, __u64 time) {
printf("Состояние кнопки - %s, временная отметка: %lld\n", event == 1 ? "Нажата" : "Отжата", time);
delay(100);
// Если кнопка нажата - переключаем светодиод
if (event && digitalRead(BUTTON)) {
LED_ON = !LED_ON;
}
}
void loop() {
// Основной цикл программы
if (LED_ON) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
interruptStopAll();
digitalWrite(LED, LOW);
pinMode(LED, DISABLE);
pinMode(BUTTON, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "wiringRP.h"
#include "event_gpio.h"
// Глобальные переменные и константы
const int LED = 117; // Светодиод. Контакт GPIO3_C5 GPIO-разъема
const int BUTTON = 139; // Кнопка. Контакт GPIO4_B3 GPIO-разъема
bool LED_ON = false;
// Объявление функции-обработчика события нажатия кнопки
void pushButtonEvent(__u32 event, __u64 time);
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(LED, OUTPUT) < 0 ||
pinMode(BUTTON, INPUT_PULLDOWN) < 0
) {
goto error;
}
if (interruptCreate(BUTTON, pushButtonEvent) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void pushButtonEvent(__u32 event, __u64 time) {
printf("Состояние кнопки - %s, временная отметка: %lld\n", event == 1 ? "Нажата" : "Отжата", time);
delay(100);
// Если кнопка нажата - переключаем светодиод
if (event && digitalRead(BUTTON)) {
LED_ON = !LED_ON;
}
}
void loop() {
// Основной цикл программы
if (LED_ON) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
interruptStopAll();
digitalWrite(LED, LOW);
pinMode(LED, DISABLE);
pinMode(BUTTON, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();