diff --git a/main/esp32-sequencer.c b/main/esp32-sequencer.c index 197cbd8..cd3c3ef 100644 --- a/main/esp32-sequencer.c +++ b/main/esp32-sequencer.c @@ -2,13 +2,16 @@ #include #include "driver/gpio.h" +#include "driver/gptimer.h" #include "esp_err.h" +#include "esp_random.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "esp_random.h" #include "driver/ledc.h" #include "hal/ledc_types.h" +#include "hal/timer_types.h" +#include "soc/clk_tree_defs.h" #define SEQ_MAX_LEN 8 @@ -24,6 +27,9 @@ #define LEDC_CLK_OUT (5) #define LEDC_GATE_OUT (6) +gptimer_handle_t clk_blink_timer = NULL; +gptimer_handle_t gate_blink_timer = NULL; + static void gpio_init(void) { // Setup Clock CV Output gpio_reset_pin(GPIO_CLK_OUT); @@ -33,6 +39,18 @@ static void gpio_init(void) { gpio_set_direction(GPIO_GATE_OUT, GPIO_MODE_OUTPUT); } +static void gate_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { + gptimer_stop(gate_blink_timer); + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, 0)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1)); +} + +static void clk_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { + gptimer_stop(clk_blink_timer); + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0)); +} + static void ledc_init(void) { // Setup LEDC PWM timer configuration ledc_timer_config_t ledc_timer = { @@ -67,23 +85,56 @@ static void ledc_init(void) { .hpoint = 0 }; ESP_ERROR_CHECK(ledc_channel_config(&ledc_gate_channel)); + + // Setup LED blink timer + gptimer_config_t led_blink_timer_config = { + .clk_src = GPTIMER_CLK_SRC_DEFAULT, + .direction = GPTIMER_COUNT_UP, + .resolution_hz = 1 * 1000 * 1000 // 1MHz; 1 tick = 1 µs + }; + ESP_ERROR_CHECK(gptimer_new_timer(&led_blink_timer_config, &clk_blink_timer)); + ESP_ERROR_CHECK(gptimer_new_timer(&led_blink_timer_config, &gate_blink_timer)); + + // Configure timer alarm + gptimer_alarm_config_t led_off_alarm_config = { + .alarm_count = 100 * 1000, // 50ms @ 1MHz + .reload_count = 0, + .flags.auto_reload_on_alarm = true + }; + ESP_ERROR_CHECK(gptimer_set_alarm_action(clk_blink_timer, &led_off_alarm_config)); + ESP_ERROR_CHECK(gptimer_set_alarm_action(gate_blink_timer, &led_off_alarm_config)); + + //register clk callback + gptimer_event_callbacks_t clk_cbs = {.on_alarm = clk_off_alarm_cb}; + ESP_ERROR_CHECK( + gptimer_register_event_callbacks(clk_blink_timer, &clk_cbs, NULL)); + ESP_ERROR_CHECK(gptimer_enable(clk_blink_timer)); + + // register gate callback + gptimer_event_callbacks_t gate_cbs = {.on_alarm = gate_off_alarm_cb}; + ESP_ERROR_CHECK( + gptimer_register_event_callbacks(gate_blink_timer, &gate_cbs, NULL)); + ESP_ERROR_CHECK(gptimer_enable(gate_blink_timer)); } -void blink_led(ledc_channel_t channel) { +static void blink_led(ledc_channel_t channel) { ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, 9000)); ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, channel)); - vTaskDelay(10 / portTICK_PERIOD_MS); - ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, 0)); - ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, channel)); + + if (channel == LEDC_CHANNEL_0) { + ESP_ERROR_CHECK(gptimer_start(clk_blink_timer)); + } else if (channel == LEDC_CHANNEL_1) { + ESP_ERROR_CHECK(gptimer_start(gate_blink_timer)); + } } -void pulse_cv(uint8_t gpio_num) { +static void pulse_cv(uint8_t gpio_num) { gpio_set_level(gpio_num, 1); vTaskDelay(20 / portTICK_PERIOD_MS); gpio_set_level(gpio_num, 0); } -void gen_rand_seq(uint8_t *sequence) { +static void gen_rand_seq(uint8_t *sequence) { for (uint8_t i = 0; i < SEQ_MAX_LEN; i++) { sequence[i] = esp_random() % 2; }