1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "driver/ledc.h"
#define LED_GPIO GPIO_NUM_2
#define FULL_EV_BIT BIT0 #define EMPTY_EV_BIT BIT1
static EventGroupHandle_t ledc_event_handle;
bool IRAM_ATTR ledc_finish_cb(const ledc_cb_param_t *param, void *user_arg) { BaseType_t taskWorken;
if(param->duty) { xEventGroupSetBitsFromISR(ledc_event_handle, FULL_EV_BIT, &taskWorken); } else { xEventGroupSetBitsFromISR(ledc_event_handle, EMPTY_EV_BIT, &taskWorken); }
return taskWorken; }
void led_run_task(void *param) { EventBits_t ev;
while (1) { ev = xEventGroupWaitBits(ledc_event_handle, FULL_EV_BIT | EMPTY_EV_BIT, pdTRUE, pdFALSE, pdMS_TO_TICKS(5000));
if(ev & FULL_EV_BIT) { ledc_set_fade_with_time(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0, 2000); ledc_fade_start(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT); } if(ev & EMPTY_EV_BIT) { ledc_set_fade_with_time(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 8191, 2000); ledc_fade_start(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT); }
ledc_cbs_t cbs = { .fade_cb = ledc_finish_cb, }; ledc_cb_register(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, &cbs, NULL); } }
void app_main(void) { gpio_config_t led_cfg = { .pin_bit_mask = 1 << LED_GPIO, .pull_up_en = GPIO_PULLUP_DISABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE, .mode = GPIO_MODE_OUTPUT, .intr_type = GPIO_INTR_DISABLE, }; gpio_config(&led_cfg);
ledc_timer_config_t ledc_timer = { .speed_mode = LEDC_LOW_SPEED_MODE, .timer_num = LEDC_TIMER_0, .clk_cfg = LEDC_AUTO_CLK, .freq_hz = 5000, .duty_resolution = LEDC_TIMER_13_BIT, }; ledc_timer_config(&ledc_timer);
ledc_channel_config_t ledc_channel = { .speed_mode = LEDC_LOW_SPEED_MODE, .channel = LEDC_CHANNEL_0, .timer_sel = LEDC_TIMER_0, .gpio_num = LED_GPIO, .duty = 0, .intr_type = LEDC_INTR_DISABLE, }; ledc_channel_config(&ledc_channel);
ledc_fade_func_install(0);
ledc_set_fade_with_time(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 8191, 2000); ledc_fade_start(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT);
ledc_event_handle = xEventGroupCreate();
ledc_cbs_t cbs = { .fade_cb = ledc_finish_cb, }; ledc_cb_register(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, &cbs, NULL);
xTaskCreatePinnedToCore(led_run_task, "led1", 2048, (void *)LED_GPIO, 3, NULL, 1); }
|