Написал (точнее скопировал и переделал) функцию, которая при нажатии кнопки делает прерывания и выполняет функцию. Вот функция, если кому надо
Теперь хочу сделать, чтобы при долгом удержании (3-6 сек.) стирались настройки. Но мне не ясно, как я могу посчитать сколько была надавлена кнопка.
Пока я вижу только один способ:
1. Когда давится кнопка (по спадающему фронту) включать таймер, который каждые 20мс пишет в счётчик. Одновременно поменять прерывание, чтобы оно работало по восходящему фронту и когда оно сработает смотреть сколько времени в счётчике.
Мне пока непонятно как я могу перенастроить прерывание и возможно ли это вообще, а так-же правильный ли это путь.
Как это правильно сделать?
Код:
// Инициализация кнопки CONFMODE (GPIO0)
void BtnInit() {
// Уст. GPIO 0 на ввод-вывод
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
// Вкл. подтяг. резистор
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U);
// Откл. глоб.прерываний
ETS_GPIO_INTR_DISABLE();
// Подкл. процедуры обраб. прерываний
ETS_GPIO_INTR_ATTACH(input_intr_handler, NULL);
GPIO_DIS_OUTPUT(BTN_CONFIG_GPIO);
// Очистка статуса
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(2));
// Вкл.прерываний
gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
// Вкл.глоб.прерываний
ETS_GPIO_INTR_ENABLE();
// Таймер
os_timer_disarm(&DebounceTimer);
os_timer_setfn(&DebounceTimer, &debounce_timer_cb, 0);
}
// Процедура обраб. прерываний
LOCAL void input_intr_handler(void *arg)
{
// Состояние GPIO
uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
// Очистка
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
// Откл.прерываний
ETS_GPIO_INTR_DISABLE();
gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_DISABLE);
// Вкл.прерываний
ETS_GPIO_INTR_ENABLE();
// Установка таймера
os_timer_arm(&DebounceTimer, 200, 0);
}
// Выполняется в случае нажатия кнопки CONFMODE
void ICACHE_FLASH_ATTR debounce_timer_cb(void *arg)
{
ETS_GPIO_INTR_DISABLE();
gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
ETS_GPIO_INTR_ENABLE();
os_printf("Button was pressed\n");
}
Пока я вижу только один способ:
1. Когда давится кнопка (по спадающему фронту) включать таймер, который каждые 20мс пишет в счётчик. Одновременно поменять прерывание, чтобы оно работало по восходящему фронту и когда оно сработает смотреть сколько времени в счётчике.
Мне пока непонятно как я могу перенастроить прерывание и возможно ли это вообще, а так-же правильный ли это путь.
Как это правильно сделать?
Последнее редактирование: