Create a new project based on the RTOS SDK example titled gpio. This example is setup to
Fantastic news! We've Found the answer you've been seeking!
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. 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); | |
} | |
} |
Related Book For
Microsoft Visual C# An Introduction to Object-Oriented Programming
ISBN: 978-1337102100
7th edition
Authors: Joyce Farrell
Posted Date: