05. Прерывания GPIO

Опишем алгоритм настройки и обработки прерываний GPIO на примере 4 пина.

В самом верху файла после #include необходимо прописать заглушки (они необходимы для работы с прерываниями):

void ets_isr_mask(unsigned intr);
void ets_isr_unmask(unsigned intr);
После заглушек напишем callback функцию (функцию обработчика прерываний)

static void GPIO_EXTI_handler() //функция обработчика прерываний
{

uint32_t gpio_st=GPIO_REG_READ(GPIO_STATUS_ADDRESS); //получаем данные из регистра состояний
ETS_GPIO_INTR_DISABLE(); //отключаем прерывания, чтобы не было 2х прерываний за время обработчика

if(gpio_st & BIT4)
{
//to do somethink;
}
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_st); //сбрасываем бит прерывания в регистре
ETS_GPIO_INTR_ENABLE(); //включаем прерывания

}

//——————————

Перед вечным циклом необходимо:

  1. Настроить GPIO на вход (см. 4)
    Прописать:
  2. ETS_GPIO_INTR_DISABLE(); //отключаем прерывания
  3. ETS_GPIO_INTR_ATTACH(GPIO_EXTI_handler, NULL); //устанавливаем функцию прерывания и тип события
  4. gpio_pin_intr_state_set(GPIO_ID_PIN(4),GPIO_PIN_INTR_POSEDGE); //назначаем тип прерывания для пина
    //по факту можно писать gpio_pin_intr_state_set(4,GPIO_PIN_INTR_POSEDGE); т.к. смещение =0
  5. ETS_GPIO_INTR_ENABLE(); //включаем прерывания

Возможные типы событий описаны в перечислении
typedef enum {
GPIO_PIN_INTR_DISABLE = 0, //выключить
GPIO_PIN_INTR_POSEDGE = 1, //0->1
GPIO_PIN_INTR_NEGEDGE = 2, //1->0
GPIO_PIN_INTR_ANYEDGE = 3, //любой фронт
GPIO_PIN_INTR_LOLEVEL = 4, //низкий уровень
GPIO_PIN_INTR_HILEVEL = 5 //любой уровень
} GPIO_INT_TYPE;

При работе программы, при возникновении прерывания будем входить в функцию GPIO_EXTI_handler(), в ней проверять что событие по 4 пину и выполнять код, обозначенный как «//to do somethink;»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *