一、工程模板
新建的工程模板可使用IDF中examples下get-started中sample_project工程复制到ESP-idf文件夹下。
二、示例程序
实现功能:按下一次按键点亮一个LED灯,再按下熄灭LED灯,依次循环。(找一个有按键和LED的开发板,用杜邦线把ESP32上IO口连接到对应开发板的LED和按键上)
1、函数操作
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define GPIO_NUM_26 26//IO口26
#define GPIO_NUM_17 17//IO口17
void app_main(void)
{
static unsigned char flag = 1;//led灯亮灭标志位
gpio_pad_select_gpio(GPIO_NUM_26);
gpio_set_direction(GPIO_NUM_26, GPIO_MODE_OUTPUT);//输出
gpio_pad_select_gpio(GPIO_NUM_17);
gpio_set_direction(GPIO_NUM_17, GPIO_MODE_INPUT);//输入
while(1)
{
if(0 == gpio_get_level(GPIO_NUM_17))
{
vTaskDelay(10 / portTICK_PERIOD_MS);//消抖
if(0 == gpio_get_level(GPIO_NUM_17))
{
printf("press the key!\n");
flag = !flag;
if(0 == flag)
{
printf("Turning on the LED\n");
gpio_set_level(GPIO_NUM_26, 0);
}
else
{
printf("Turning off the LED\n");
gpio_set_level(GPIO_NUM_26, 1);
}
}
while(!gpio_get_level(GPIO_NUM_17));//防止按下不松手连续触发
}
vTaskDelay(10 / portTICK_PERIOD_MS);//避免触发看门狗
}
}
2、结构体操作
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define GPIO_NUM_26 26//IO口26
#define GPIO_NUM_17 17//IO口17
#define GPIO_OUTPUT_PIN_SEL (1ULL<<GPIO_NUM_26) // 配置GPIO_OUT位寄存器
#define GPIO_INPUT_PIN_SEL (1ULL<<GPIO_NUM_17)
void gpio_init(void)
{
gpio_config_t io_conf; // 定义一个gpio_config类型的结构体,下面的都算对其进行的配置
io_conf.intr_type = GPIO_PIN_INTR_DISABLE; // 禁止中断
io_conf.mode = GPIO_MODE_OUTPUT; // 选择输出模式
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO_OUT寄存器
io_conf.pull_down_en = 0; // 禁止下拉
io_conf.pull_up_en = 0; // 禁止上拉
gpio_config(&io_conf); // 最后配置使能
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
io_conf.mode = GPIO_MODE_INPUT; //选择输入模式
io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 0;
gpio_config(&io_conf);
}
void app_main(void)
{
static unsigned char flag = 1;//led灯亮灭标志位
gpio_init();
while(1)
{
if(0 == gpio_get_level(GPIO_NUM_17))
{
vTaskDelay(10 / portTICK_PERIOD_MS);//消抖
if(0 == gpio_get_level(GPIO_NUM_17))
{
printf("press the key!\n");
flag = !flag;
if(0 == flag)
{
printf("Turning on the LED\n");
gpio_set_level(GPIO_NUM_26, 0);
}
else
{
printf("Turning off the LED\n");
gpio_set_level(GPIO_NUM_26, 1);
}
}
while(!gpio_get_level(GPIO_NUM_17));//防止按下不松手连续触发
}
vTaskDelay(10 / portTICK_PERIOD_MS);//避免触发看门狗
}
}