video_20210722_231653
本帖最后由 游走在01的海洋 于 2021-8-8 20:06 编辑
一、示范 1.简介 1)使用~esp-idfexamplesperipheralsgpio目录下的generic_gpio例程; 2)使用前将此工程复制到自己创建的工程文件夹中; 2.杜邦线所对应引脚 //褐色 19 红色LED //灰色 18 绿色LED //绿色 4 双边沿中断 //橙色 5 上升沿中断 //红色 VCC 3.3 //蓝色 GND 3.图片:硬件---面包板、杜邦线x6、LED灯
1)IO18、19普通输出模式
2)IO4 输入双边沿中断模式
1)IO5输入上升沿中断模式
3.视频(有兴趣的可以看百度云盘)
链接:https://pan.baidu.com/s/1L71FQT-RkdvYmAdDzhWGyQ
提取码:ed60
二、代码
1.全部代码
- #define GPIO_OUTPUT_IO_0 18
- #define GPIO_OUTPUT_IO_1 19
- #define GPIO_OUTPUT_PIN_SEL ((1ULL<
- #define GPIO_INPUT_IO_0 4
- #define GPIO_INPUT_IO_1 5
- #define GPIO_INPUT_PIN_SEL ((1ULL<
- #define ESP_INTR_FLAG_DEFAULT 0
- static xQueueHandle gpio_evt_queue = NULL;
- /***************************GPIO中断回调函数*****************************************/
- static void IRAM_ATTR 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)) {
- printf("GPIO[%d] intr, val: %dn", io_num, gpio_get_level(io_num));
- }
- }
- }
- void app_main(void)
- {
- /***************************GPIO使用gpio_config_t结构体的来进行配置********************/
- gpio_config_t io_conf; //定义gpio_config_t结构体
- //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.GPIO18/19
- 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);//改变IO4引脚输入中断为双边沿
- /***************************创建消息队列,创建任务************************************/
- //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(ESP_INTR_FLAG_DEFAULT);//开启GPIO中断服务
- //hook isr handler for specific gpio pin //设置GPIO_INPUT_IO_0引脚的中断回调函数gpio_isr_handler
- gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
- //hook isr handler for specific gpio pin //设置GPIO_INPUT_IO_1引脚的中断回调函数gpio_isr_handler
- gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);
- //remove isr handler for gpio number. //移除GPIO_INPUT_IO_0中断
- gpio_isr_handler_remove(GPIO_INPUT_IO_0);
- //hook isr handler for specific gpio pin again //设置GPIO_INPUT_IO_0引脚的中断回调函数gpio_isr_handler
- gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
- /*************************************************************************************/
- //esp_get_minimum_free_heap_size:返回程序执行期间可用的最小空闲堆内存大小。
- printf("Minimum free heap size: %d bytesn", esp_get_minimum_free_heap_size());
复制代码
2.硬件连接好之后;在ESP-IDF命令工具中编译、下载,可以看到LED闪烁;
3.分别将IO4、5的杜邦线插在IO18引脚所在 电路上,触发中断,串口打印引脚中断电平;
三、各个GPIO函数的定义解释
1.gpio_config_t
- /**
- * [url=home.php?mod=space&uid=2666770]@Brief[/url] Configuration parameters of GPIO pad for gpio_config function
- */
- typedef struct {
- uint64_t pin_bit_mask; /*!< GPIO pin: set with bit mask, each bit maps to a GPIO */
- gpio_mode_t mode; /*!< GPIO mode: set input/output mode */
- gpio_pullup_t pull_up_en; /*!< GPIO pull-up */
- gpio_pulldown_t pull_down_en; /*!< GPIO pull-down */
- gpio_int_type_t intr_type; /*!< GPIO interrupt type */
- } gpio_config_t;
复制代码
2.其他关于中断服务函数的看直接看程序就会懂;
四、ESP32-C3-DevkitM-1 开发板引脚布局
|