Skip to main content

Прерывания

info

В настоящее время для обработки прерываний используются системные вызовы к драйверу 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();