ESP32 GPIO使用
ESP32 GPIO使用
GPIO使用需要加入必要的GPIO库
#include <driver/gpio.h>
接下来进行初始化GPIO
#define GPIO_OUT_PIN 2 //定义引脚号
#define GPIO_OUTPUT_PIN_SEL (1<<GPIO_OUT_PIN) //定义输出引脚的宏,用来将输出引脚号转换为位掩码
void bsp_gpio_init(){
gpio_config_t io_conf;
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO引脚
io_conf.mode = GPIO_MODE_OUTPUT; // 配置GPIO模式
io_conf.pull_up_en = 0; // 配置上拉电阻
io_conf.pull_down_en = 0; // 配置下拉电阻
io_conf.intr_type = GPIO_INTR_ANYEDGE; //配置GPIO口的中断类型
gpio_config(&io_conf);
}
其他可以选择的参数:
intr_type:中断类型
GPIO_INTR_DISABLE(禁止中断)
GPIO_INTR_POSEDGE(上升沿触发)
GPIO_INTR_NEGEDGE(下降沿触发)
GPIO_INTR_ANYEDGE(边沿触发)
GPIO__INTR_LOW_LEVEL(低电平触发)
GPIO_INTR_HIGH_LEVEL(高电平触发)。
mode:GPIO口的工作模式,
GPIO_MODE_INPUT(输入模式)
GPIO_MODE_OUTPUT(输出模式)
GPIO_MODE_INPUT_OUTPUT(输入/输出模式)。
具体模式如下:
pin_bit_mask:GPIO口的引脚编号,具体需要还是按位操作,下面是参考命名:
GPIO_INPUT_PIN_SEL(输入引脚)
GPIO_OUTPUT_PIN_SEL(输出引脚)。
还可以如下配置
//定义需要操作的GPIO
#define GPIO_OUT_Pin 2 //配置的GPIO引脚
#define GPIO_ON gpio_set_level(GPIO_OUT_Pin, 1) //高电平
#define GPIO_OFF gpio_set_level(GPIO_OUT_Pin, 0) //低电平
void bsp_gpio_init(void){
gpio_config_t io_conf;
io_conf.pin_bit_mask = (1<<GPIO_OUT_Pin); //注意pin_bit_mask配置GPIO的引脚要按位,左移2位即配置GPIO2
io_conf.mode = GPIO_MODE_OUTPUT; //配置GPIO模式 -- 输出模式
i0_conf.pull_down_en = 0; //配置下拉电阻 -- 无下拉
i0_conf.pull_up_en = 0; //配置上拉电阻 -- 无上拉
i0_conf.intr_type = GPIO_PIN_INTR_NEGEDGE; //配置中断类型 -- 下降沿中断
gpio_config(&io_conf);
}
pull_down_en:是否启用GPIO口的下拉电阻,可以选择0(禁止)或1(启用)。
pull_up_en:是否启用GPIO口的上拉电阻,可以选择0(禁止)或1(启用)。
示例:
#include <stdio.h>
#include "esp_log.h"
#include"freertos/FreeRTOS.h"
#include"freertos/task.h"
#include"driver/gpio.h"
#include "driver/uart.h"
#include <esp_timer.h>
#define GPIO_OUT_PIN 2
#define GPIO_OUTPUT_PIN_SEL (1<<GPIO_OUT_PIN)
#define GPIO_ON gpio_set_level(GPIO_OUT_PIN, 1) //高电平
#define GPIO_OFF gpio_set_level(GPIO_OUT_PIN, 0) //低电平
static const char* TAG = "GPIO";
//#define BUF_SIZE (1024)
void bsp_gpio_init(){
gpio_config_t io_conf;
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO引脚
io_conf.mode = GPIO_MODE_OUTPUT; // 配置GPIO模式
io_conf.pull_up_en = 0; // 配置上拉电阻
io_conf.pull_down_en = 0; // 配置下拉电阻
io_conf.intr_type = GPIO_INTR_ANYEDGE; //配置GPIO口的中断类型
gpio_config(&io_conf);
// uart_config_t uart_config = {
// .baud_rate = 115200,
// .data_bits = UART_DATA_8_BITS,
// .parity = UART_PARITY_DISABLE,
// .stop_bits = UART_STOP_BITS_1,
// .flow_ctrl = UART_HW_FLOWCTRL_DISABLE
// };
// uart_param_config(UART_NUM_1, &uart_config);
// uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
// uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL, 0);
printf("init\n");
ESP_LOGI(TAG, "GPIO Init ready!");
}
void app_main(void)
{
uint16_t count = 0;
bsp_gpio_init();
while(1){
if(0 == count){
count = 1;
GPIO_ON;
}
else{
count = 0;
GPIO_OFF;
}
ESP_LOGI(TAG,"count:%d", count);
vTaskDelay(1000 / portTICK_PERIOD_MS); /* 1000 / portTICK_PERIOD_MS,表示延时1000ms,
portTICK_PERIOD_MS表示每ms有多少个ticks,
ticks是一个时间片,一般1ms有1000ticks,
如果延时1000ms,则需要1000*1000=1000000ticks。
*/
}
}
有关ESP_LOGI(TAG, “GPIO Init ready!”);可以看之前文章
https://blog.csdn.net/hongyun1221/article/details/129391697