Question: Create a new project based on the RTOS SDK example titled gpio. This example is setup to use 4 pins, 2 inputs, and 2 outputs.
Create a new project based on the RTOS SDK example titled "gpio". This example is setup to use 4 pins, 2 inputs, and 2 outputs. Adjust the example, using appropriate coding standards, so that:
(a) Only a single input and a single output are specified, and the input and output pins selected are consistent with available pins on the ESP-01S
(b) A single handler is installed and used for the input on the falling edge.
| #include | |
| #include | |
| #include | |
| #include "freertos/FreeRTOS.h" | |
| #include "freertos/task.h" | |
| #include "freertos/queue.h" | |
| #include "driver/gpio.h" | |
| #include "esp_log.h" | |
| #include "esp_system.h" | |
| static const char *TAG = "main"; | |
| /** | |
| * Brief: | |
| * This test code shows how to configure gpio and how to use gpio interrupt. | |
| * | |
| * GPIO status: | |
| * GPIO15: output | |
| * GPIO16: output | |
| * GPIO4: input, pulled up, interrupt from the rising edge and falling edge | |
| * GPIO5: input, pulled up, interrupt from the rising edge. | |
| * | |
| * Test: | |
| * Connect GPIO15 with GPIO4 | |
| * Connect GPIO16 with GPIO5 | |
| * Generate pulses on GPIO15/16, that triggers interrupt on GPIO4/5 | |
| * | |
| */ | |
| #define GPIO_OUTPUT_IO_0 15 | |
| #define GPIO_OUTPUT_IO_1 16 | |
| #define GPIO_OUTPUT_PIN_SEL ((1ULL< | |
| #define GPIO_INPUT_IO_0 4 | |
| #define GPIO_INPUT_IO_1 5 | |
| #define GPIO_INPUT_PIN_SEL ((1ULL< | |
| static xQueueHandle gpio_evt_queue = NULL; | |
| static void gpio_isr_handler(void *arg) | |
| { | |
| uint32_t gpio_num = (uint32_t) arg; | |
| xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); | |
| } | |
| static void gpio_task_example(void *arg) | |
| { | |
| uint32_t io_num; | |
| for (;;) { | |
| if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { | |
| ESP_LOGI(TAG, "GPIO[%d] intr, val: %d", io_num, gpio_get_level(io_num)); | |
| } | |
| } | |
| } | |
| void app_main(void) | |
| { | |
| gpio_config_t io_conf; | |
| //disable interrupt | |
| io_conf.intr_type = GPIO_INTR_DISABLE; | |
| //set as output mode | |
| io_conf.mode = GPIO_MODE_OUTPUT; | |
| //bit mask of the pins that you want to set,e.g.GPIO15/16 | |
| io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; | |
| //disable pull-down mode | |
| io_conf.pull_down_en = 0; | |
| //disable pull-up mode | |
| io_conf.pull_up_en = 0; | |
| //configure GPIO with the given settings | |
| gpio_config(&io_conf); | |
| //interrupt of rising edge | |
| io_conf.intr_type = GPIO_INTR_POSEDGE; | |
| //bit mask of the pins, use GPIO4/5 here | |
| io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL; | |
| //set as input mode | |
| io_conf.mode = GPIO_MODE_INPUT; | |
| //enable pull-up mode | |
| io_conf.pull_up_en = 1; | |
| gpio_config(&io_conf); | |
| //change gpio intrrupt type for one pin | |
| gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE); | |
| //create a queue to handle gpio event from isr | |
| gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t)); | |
| //start gpio task | |
| xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL); | |
| //install gpio isr service | |
| gpio_install_isr_service(0); | |
| //hook isr handler for specific gpio pin | |
| gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *) GPIO_INPUT_IO_0); | |
| //hook isr handler for specific gpio pin | |
| gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void *) GPIO_INPUT_IO_1); | |
| //remove isr handler for gpio number. | |
| gpio_isr_handler_remove(GPIO_INPUT_IO_0); | |
| //hook isr handler for specific gpio pin again | |
| gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *) GPIO_INPUT_IO_0); | |
| int cnt = 0; | |
| while (1) { | |
| ESP_LOGI(TAG, "cnt: %d", cnt++); | |
| vTaskDelay(1000 / portTICK_RATE_MS); | |
| gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2); | |
| gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2); | |
| } | |
| } |
Step by Step Solution
3.40 Rating (166 Votes )
There are 3 Steps involved in it
Heres the modified code for the gpio example in the RTOS SDK include ... View full answer
Get step-by-step solutions from verified subject matter experts
