1、前言
学习一款新的芯片,第一步都是想要点亮一个小灯,所以首先要学习GPIO的一些基本操作,掌握了相关的API就能进行电灯操作了,本文主要讲解GPIO相关API的使用。
2、GPIO输入输出
(1)头文件
#include "driver/gpio.h"
(2)IO初始化
首先了解一个结构体 gpio_config_t,通过初始化该结构体变量后调用gpio_config函数配置PIN脚。
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;
输入输出配置如下
/*output*/
gpio_config_t gpio_set_out = {
.pin_bit_mask = (1ULL << GPIO_NUM_2),
.mode = GPIO_MODE_OUTPUT,
.pull_down_en = GPIO_PULLUP_DISABLE,
.pull_up_en = GPIO_PULLDOWN_DISABLE,
};
gpio_config(&gpio_set_out);
/*input*/
gpio_config_t gpio_set_in = {
.pin_bit_mask = (1ULL << GPIO_NUM_15),
.mode = GPIO_MODE_DEF_INPUT,
.pull_down_en = GPIO_PULLUP_ENABLE,
.pull_up_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_HIGH_LEVEL,
};
gpio_config(&gpio_set_in);
NOTE1:这里需要注意的就是pin_bit_mask 这个成员变量表述有个 “bit maps”,所以注意是用的映射的位表示PIN脚,(1ULL<<)这一步必不可少
NOTE2:其他相关的API查看gpio.h即可 ,这里附一个乐鑫官网的链接 https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/gpio.html
(3)其他
/*设置gpio_num 的电平状态 1-高 0-低*/
esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level)
/*获取gpio_num 的电平状态 -- 返回值*/
int gpio_get_level(gpio_num_t gpio_num)
这里通过gpio_set_level 设置某个IO输出电平状态就用gpio_num_t 枚举值了,不需要移位操作。
3、ISR
了解GPIO的中断需要了解的就是结构体gpio_config_t 中 成员变量intr_type,也就是配置中断的触发方式,常用的就是上升沿、下降沿、高电平、低电平触发
配置好触发方式之后就要,添加对应的中断函数了,一般就用到以下两个API
/*安装GPIO的中断服务,其允许为每个引脚设置独立的 GPIO 中断处理程序*/
esp_err_t gpio_install_isr_service(int intr_alloc_flags);
/*配置管脚对应的中断函数 参数1:PIN脚枚举 参数2:中断回调函数 参数3:为中断函数传参的指针变量*/
esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void *args);