ESP32S3-IDF GPIO
GPIO简介
ESP32S3提供了多达45个物理GPIO管脚,这些管脚不仅可以作为通用的输入输出接口,还可以连接到内部外设信号。通过GPIO交换矩阵、IO MUX和RTC IO MUX,可以灵活地配置外设模块的输入信号来源于任何GPIO管脚,同时外设模块的输出信号也可以连接到任意GPIO管脚。
GPIO配置
结构体方法:
#include "driver/gpio.h"// GPIO配置结构体
gpio_config_t io_conf = {.pin_bit_mask = (1ULL<<GPIO_NUM_4), // 选择GPIO4.mode = GPIO_MODE_OUTPUT, // 设置为输出模式.pull_up_en = GPIO_PULLUP_DISABLE, // 禁用上拉.pull_down_en = GPIO_PULLDOWN_ENABLE, // 启用下拉.intr_type = GPIO_INTR_DISABLE // 禁用中断
};// 配置GPIO
esp_err_t ret = gpio_config(&io_conf);
if (ret != ESP_OK) {printf("GPIO配置失败\n");
}
此外,ESP-IDF还提供了一种更简单的方法来配置GPIO。
#include "driver/gpio.h"// 设置GPIO22为输出
gpio_set_direction(GPIO_NUM_22, GPIO_MODE_OUTPUT);
// 设置GPIO22输出低电平
gpio_set_level(GPIO_NUM_22, 0);
这里我们使用gpio_set_direction
和gpio_set_level
函数来配置它的方向和输出电平。
LED灯闪烁实验
这里我参考正点原子的教学案例,将LED的代码部分单独放到.c .h文件中
main文件
/*** @file main.c* @author 宁子希 (1589326497@qq.com)* @brief LED点灯实验* @version 0.1* @date 2024-03-10* * @copyright Copyright (c) 2024* */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "LED.h"void app_main(void)
{led_init(); /* 初始化LED */while(1){LED_A_TOGGLE();LED_B_TOGGLE();vTaskDelay(500/portTICK_PERIOD_MS); /* 延时500ms */}}
LED.h文件
/*** @file LED.h* @author 宁子希 (1589326497@qq.com)* @brief LED驱动代码* @version 0.1* @date 2024-03-10* * @copyright Copyright (c) 2024* */
#ifndef __LED_H_
#define __LED_H_
#include "driver/gpio.h"//引脚定义
#define LED_A_GPIO_PIN GPIO_NUM_10
#define LED_B_GPIO_PIN GPIO_NUM_11//引脚的输出的电平状态
enum GPIO_OUTPUT_state{GPIO_OUTPUT_HIGH,GPIO_OUTPUT_LOW
};//LED端口定义 翻转LED
#define LEDA(x) do{ x ? \gpio_set_level(LED_A_GPIO_PIN, GPIO_OUTPUT_HIGH): \gpio_set_level(LED_A_GPIO_PIN, GPIO_OUTPUT_LOW); \}while(0)#define LEDB(x) do{ x ? \gpio_set_level(LED_B_GPIO_PIN, GPIO_OUTPUT_HIGH): \gpio_set_level(LED_B_GPIO_PIN, GPIO_OUTPUT_LOW); \}while(0)
//LED取反定义
#define LED_A_TOGGLE() do{gpio_set_level(LED_A_GPIO_PIN,!gpio_get_level(LED_A_GPIO_PIN));}while(0)
#define LED_B_TOGGLE() do{gpio_set_level(LED_B_GPIO_PIN,!gpio_get_level(LED_B_GPIO_PIN));}while(0) //函数声明
void led_init(void); //初始化LED#endif
LED.c文件
/*** @file LED.c* @author 宁子希 (1589326497@qq.com)* @brief LED驱动代码* @version 0.1* @date 2024-03-10* * @copyright Copyright (c) 2024* */#include "LED.h"
/*** @brief 初始化LED*/
void led_init(void){//初始化GPIOgpio_config_t gpio_init_struct = {0};gpio_init_struct.intr_type = GPIO_INTR_DISABLE; /* 失能引脚中断 */gpio_init_struct.mode = GPIO_MODE_INPUT_OUTPUT; /* 输入输出模式 */gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE; /* 使能上拉 */gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE; /* 失能下拉 */gpio_init_struct.pin_bit_mask = (1ull << LED_A_GPIO_PIN)|(1ull<<LED_B_GPIO_PIN); /* 设置的引脚的位掩码 */gpio_config(&gpio_init_struct); /* 配置GPIO */LEDA(0); /* 关闭LED */LEDB(0); /* 关闭LED */
}