#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#include "soc/timer_group_struct.h"
#define STEP 1
#define DIR 2
#define BUTTON 3
#define DEBOUNCE_TIME 1000
uint8_t step = 0;
uint64_t last_int = 0;
void right_step() {
gpio_set_level(DIR, 1);
gpio_set_level(STEP, 1);
vTaskDelay(10 / portTICK_PERIOD_MS);
gpio_set_level(STEP, 0);
}
void left_step() {
gpio_set_level(DIR, 0);
gpio_set_level(STEP, 1);
vTaskDelay(10 / portTICK_PERIOD_MS);
gpio_set_level(STEP, 0);
}
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
uint32_t pin = (uint32_t)arg;
int64_t now = esp_timer_get_time();
if (now - last_int > DEBOUNCE_TIME)
{
last_int = now;
if (pin == BUTTON)
{
step = 1;
}
}
}
void setup_() {
gpio_config_t gpio_output;
gpio_output.pin_bit_mask = (1 << STEP | 1 << DIR);
gpio_output.pull_down_en = GPIO_PULLDOWN_DISABLE;
gpio_output.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_output.mode = GPIO_MODE_OUTPUT;
gpio_output.intr_type = GPIO_INTR_DISABLE;
gpio_config(&gpio_output);
gpio_config_t gpio_input_interrupt;
gpio_input_interrupt.pin_bit_mask = (1 << BUTTON);
gpio_input_interrupt.pull_down_en = GPIO_PULLDOWN_ENABLE;
gpio_input_interrupt.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_input_interrupt.mode = GPIO_MODE_INPUT;
gpio_input_interrupt.intr_type = GPIO_INTR_POSEDGE;
gpio_config(&gpio_input_interrupt);
gpio_install_isr_service(0);
gpio_isr_handler_add(BUTTON, gpio_isr_handler, (void *)BUTTON);
}
void app_main() {
setup_();
while (true) {
if (step == 1)
{
right_step();
step = 0;
}
else if (step == 2)
{
left_step();
step = 0;
}
}
}