К СВЕДЕНИЮ
В настоящее время для обработки прерываний используются системные вызовы к драйверу gpio. При использовании функций из данного раздела необходимо учитывать, что:
- драйвер gpio не поддерживает обработку прерываний для входов использующих интегрированные подтягивающие "вниз" резисторы (режим
INPUT_PULLDOWN
); - драйвер gpio требует настройки прав доступа пользователя для чтения/записи к символьным устройствам
gpiochip0
иgpiochip1
; - в SoC Allwinner H5 отсутствует аппаратная поддержка прерываний для
PC
контактов (для RepkaPi 3 этоPC0
-PC3
контакты).
interruptCreate() #
Инициализирует функцию обработки прерываний для указанного в параметре контакта, и задает функцию обратного вызова для обработки события изменения уровня логического напряжения на входном контакте.
Синтаксис #
int interruptCreate(int pin, void(*callback)(__u32, __u64))
Параметры #
pin
- номер контакта.
void(*callback)(__u32, __u64)
- функция обратного вызова для обработки события изменения уровня логического напряжения на входном контакте.
Возврат #
0 при успешном выполнении, или отрицательное значение в случае ошибки.
interruptStop() #
Завершает обработку прерываний для указанного в параметре входного контакта
Синтаксис #
void interruptStop(int pin)
Параметры #
pin
- номер контакта.
Возврат #
Ничего.
interruptStopAll() #
Завершает обработку прерываний для всех ранее инициализированных входных контактов
Синтаксис #
void interruptStopAll()
Параметры #
Ничего.
Возврат #
Ничего.
Пример использования прерываний #
Код включает светодиод при нажатии сопоставленной с ним кнопки.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "wiringRP.h"
#include "event_gpio.h"
// Глобальные переменные и константы
const int LED_1 = 8;
const int LED_2 = 9;
const int BUTTON_1 = 10;
const int BUTTON_2 = 1;
bool LED_1_ON = false;
bool LED_2_ON = false;
// Обработчики событий нажатия кнопки
void pushButton1(__u32 event, __u64 time);
void pushButton2(__u32 event, __u64 time);
void setup() {
// Инициализация библиотек wiringRP
if(setupWiringRP(WRP_MODE_SUNXI) < 0)
exit(EXIT_FAILURE);
// Инициализация пользовательских объектов
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(BUTTON_1, INPUT_PULLUP);
pinMode(BUTTON_2, INPUT);
interruptCreate(BUTTON_1, pushButton1);
interruptCreate(BUTTON_2, pushButton2);
}
void pushButton1(__u32 event, __u64 time) {
printf("Button 1 - is %s, timestamp: %lld\n", event == 1 ? "RISING" : "FALLING", time);
delay(100);
if(event && digitalRead(BUTTON_1))
LED_1_ON = !LED_1_ON;
}
void pushButton2(__u32 event, __u64 time) {
printf("Button 2 - is %s, timestamp: %lld\n", event == 1 ? "RISING" : "FALLING", time);
delay(100);
if(event && digitalRead(BUTTON_2))
LED_2_ON = !LED_2_ON;
}
void loop() {
// Основной цикл программы
if(LED_1_ON)
digitalWrite(LED_1, HIGH);
else
digitalWrite(LED_1, LOW);
if(LED_2_ON)
digitalWrite(LED_2, HIGH);
else
digitalWrite(LED_2, LOW);
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
digitalWrite(LED_1, LOW);
pinMode(LED_1, DISABLE);
digitalWrite(LED_2, LOW);
pinMode(LED_2, DISABLE);
pinMode(BUTTON_1, DISABLE);
pinMode(BUTTON_2, DISABLE);
// Завершение работы библиотек
interruptStopAll();
releaseWiringRP();
exit(0); // выход из программы
}
MAIN_WIRINGRP();