- GPIO 输出操作
- GPIO 输入操作
- GPIO 唤醒
一 、ESP32 GPIO 概述
ESP32 芯片有 34 个物理 GPIO ,但是并不是所有GPIO 都能作为输入/输出,一以下乐鑫官网文档的说明:
注意:这 34 个物理 GPIO pad 的序列号为:019, 2123, 2527, 3239。其中 GPIO 3439 仅用作输入管脚,其他的既可以作为输入又可以作为输出管脚。
ESP32 GPIO内部的交换矩阵图,包括各种外设接口也是在这里进行切换
二、ESP32 GPIO API
点击这里有GPIO 的详细说明:ESP32 GPIO API 接口说明
2.1 点亮一个LED
点亮LED 需要以下接口:
步骤 | API 函数 | 作用 |
---|---|---|
1 | esp_err_t gpio_reset_pin(gpio_num_tgpio_num) | 复位GPIO 默认的状态 |
2 | esp_err_t gpio_set_direction(gpio_num_tgpio_num, gpio_mode_tmode) | 设置GPIO方向 |
3 | esp_err_t gpio_set_level(gpio_num_tgpio_num, uint32_t level) | 设置GPIO 电平 |
demo
#define led_pin GPIO_NUM_23
void app_main(void)
{
gpio_reset_pin(led_pin); //清除 GPIO 默认的状态
gpio_set_direction(led_pin, GPIO_MODE_OUTPUT); //GPIO 输出模式
gpio_set_level(led_pin, 0); //输出低电平
//gpio_set_level(led_pin, 1); //输出高电平
while(1) {
}
}
2.2 按键中断
通过以下操作实现 外部物理按键中断操作
步骤 | API 函数 | 作用 |
---|---|---|
1 | gpio_config_t io_config | GPIO 功能配置句柄 |
2 | esp_err_t gpio_config(const gpio_config_t *pGPIOConfig) | 使配置生效 |
3 | xQueueCreate( uxQueueLength, uxItemSize ) | 通过对列处理按键中断事件 |
4 | xTaskCreate(…) | 创建按键任务,处理按键中断的对列事件请求 |
5 | esp_err_t gpio_install_isr_service(int intr_alloc_flags) | 安装GPIO 中断服务 |
6 | esp_err_t gpio_isr_handler_add(…) | 给相应的GPIO 添加中断处理函数 |
demo
#define KEY_PIN GPIO_NUM_5
#define ESP_INTR_FLAG_DEFAULT 0
/*创建消息队列*/
static xQueueHandle gpio_evt_queue = NULL;
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 key_gpio_task(void* arg)
{
uint32_t io_num;
for(;;) {
if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
printf("收到消息\r\n");
printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num));
}
}
}
/**
* @brief init key pin
*
* @return
* - ESP_OK: Success
* - Others: Fail
*/
esp_err_t key_init(void)
{
gpio_config_t io_config=
{
io_config.pin_bit_mask =(1ull<<KEY_PIN), //设置掩码位,映射到相应的GPIO
io_config.mode =GPIO_MODE_INPUT, //GPIO 输入模式
io_config.pull_up_en =0x01, //使能上拉
io_config.pull_down_en =0x00, //失能下拉
io_config.intr_type =GPIO_INTR_POSEDGE //上升沿触发
};
gpio_config(&io_config); //使配置生效
//create a queue to handle gpio event from isr
gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
//start gpio task
xTaskCreate(key_gpio_task, "key_gpio_task", 2048, NULL, 10, NULL);
//install gpio isr service
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
//hook isr handler for specific gpio pin
gpio_isr_handler_add(KEY_PIN, gpio_isr_handler, (void*) KEY_PIN);
return ESP_OK;
}
三、总结
目前先记录这么多,其实只要多阅读官方的文档和例程,使用ESP32 还是比较容易的,不得不说ESP32 太强大了,价格还可以,外设居然这么多,完全完爆同等价位的STM32 。