Опишем алгоритм настройки и обработки прерываний 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(); //включаем прерывания
}
//——————————
Перед вечным циклом необходимо:
- Настроить GPIO на вход (см. 4)
Прописать: - ETS_GPIO_INTR_DISABLE(); //отключаем прерывания
- ETS_GPIO_INTR_ATTACH(GPIO_EXTI_handler, NULL); //устанавливаем функцию прерывания и тип события
- gpio_pin_intr_state_set(GPIO_ID_PIN(4),GPIO_PIN_INTR_POSEDGE); //назначаем тип прерывания для пина
//по факту можно писать gpio_pin_intr_state_set(4,GPIO_PIN_INTR_POSEDGE); т.к. смещение =0 - 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;»