ESP32-IDF 02-6 外设-GPIO
Posted Ciaran-byte
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32-IDF 02-6 外设-GPIO相关的知识,希望对你有一定的参考价值。
GPIO
文章目录
1. 原理层面
每个引脚的输入和输出特性都是由IO_MUX和RTC_IO_MUX决定的。
输出时,外设通过MUX与pin pad进行绑定,即可输出
输入时,pin Pad设置好外设引脚为输入状态,并且设置好哪个外设接受这个信号即可。
配置上,GPIO可以设置为上下拉,可以设置方向
功能上GPIO可以与外设绑定,可以设置中断,也可以与低功耗进行绑定
2. 编程层面
2.1 GPIO输出
esp32的GPIO可以通过函数的方法进行配置,也可以通过GPIO结构体的方法进行配置。使用GPIO结构体的话,适合连续配置。
2.1.1 通过结构体进行配置
#include "driver/gpio.h"
void setup() {
//gpio配置结构体
gpio_config_t gpio;
gpio.intr_type = GPIO_INTR_DISABLE; //禁止中断
gpio.mode = GPIO_MODE_OUTPUT; //设置为输出模式
gpio.pin_bit_mask = (1ULL << GPIO_NUM_23); //需要使用的引脚置位
gpio.pull_down_en = GPIO_PULLDOWN_DISABLE; //不下拉,因为这里是输出
gpio.pull_up_en = GPIO_PULLUP_DISABLE; //不上拉,因为这里是输出
gpio_config(&gpio); //配置
}
// the loop function runs over and over again until power down or reset
void loop() {
gpio_set_level(GPIO_NUM_23, 1); //输出高电平
delay(1000);
}
2.1.2 通过函数进行配置
#include "driver/gpio.h"
void setup() {
gpio_pad_select_gpio(GPIO_NUM_23); //选择gpio引脚
gpio_set_direction(GPIO_NUM_23, GPIO_MODE_OUTPUT); //设置功能模式
gpio_set_level(GPIO_NUM_23, 1); //设置gpio输出为高
}
// the loop function runs over and over again until power down or reset
void loop() {
}
2.2 GPIO输入
2.2.1 轮询方式
这里以按键输入检测为例,进行基于轮询的gpio输入实验。通过gpio_4进行检测输入。并且gpio_2连接了led,用于指示按键输入情况
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void setup() {
gpio_pad_select_gpio(GPIO_NUM_4); //选择gpio
gpio_set_direction(GPIO_NUM_4, GPIO_MODE_INPUT); //设置工作模式
gpio_set_pull_mode(GPIO_NUM_4, GPIO_PULLUP_ONLY); //设置上拉输入
gpio_pad_select_gpio(GPIO_NUM_2);
gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
uint32_t tag = 1;
while (1)
{
if (gpio_get_level(GPIO_NUM_4) == 0)
{
delayMicroseconds(100);
if (gpio_get_level(GPIO_NUM_4) == 0)
{
gpio_set_level(GPIO_NUM_2, tag);
tag = !tag;
while (gpio_get_level(GPIO_NUM_4) == 0);
}
}
}
}
// the loop function runs over and over again until power down or reset
void loop() {
}
2.2.2 中断方式
这里以按键输入检测为例,进行基于中断的gpio输入实验。通过gpio_4进行检测输入。并且gpio_2连接了led,用于指示按键输入情况
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
//中断服务函数
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
static uint32_t ison = 1;
gpio_set_level(GPIO_NUM_2, ison);
ison = !ison;
}
void setup() {
//接受中断的引脚
//设置gpio上拉输入
gpio_pad_select_gpio(GPIO_NUM_4);
gpio_set_direction(GPIO_NUM_4, GPIO_MODE_INPUT);
gpio_pullup_en(GPIO_NUM_4);
gpio_set_pull_mode(GPIO_NUM_4, GPIO_PULLUP_ONLY);
//设置中断
gpio_set_intr_type(GPIO_NUM_4, GPIO_INTR_NEGEDGE);//设置中断类型
gpio_install_isr_service(0); //给单个引脚注册边沿检测中断,而不是全部引脚。0表示会默认分配中断优先级1或2或3
gpio_isr_handler_add(GPIO_NUM_4, gpio_isr_handler,(void*)GPIO_NUM_4);
gpio_intr_enable(GPIO_NUM_4); //使能中断
//led
gpio_pad_select_gpio(GPIO_NUM_2);
gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
}
// the loop function runs over and over again until power down or reset
void loop() {
}
3. GPIO配置总结
- GPIO有结构体配置法和库函数配置法两种,结构体配置法适合多个引脚需要同时配置的时候。而库函数配置更适合配置单个引脚。
- 中断函数前面要加IRAM_ATTR标志符
以上是关于ESP32-IDF 02-6 外设-GPIO的主要内容,如果未能解决你的问题,请参考以下文章