Blink
通过开发历程(1)的方法2建立工程之后,将如下代码复制进Main.c
代码
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#define LED_R_IO 2
#define LED_G_IO 18
#define LED_B_IO 19
#define GPIO_OUTPUT_PIN_SEL (1ULL << LED_R_IO)
void app_main()
{
/**
* @brief 这里是两种方法,方法一使用结构体,配置更详细,不过比较麻烦
* 同时在配置中断的过程中可能会用到这种方法
* 方法二是直接通过语句简写,三两句话就搞定
*/
//方法一
gpio_config_t io_conf; //配置引脚功能结构体
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; //类似于选择哪个GPIO
io_conf.mode = GPIO_MODE_OUTPUT; //工作模式
io_conf.pull_up_en = GPIO_PULLUP_DISABLE; //上拉使能
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; //下拉使能
io_conf.intr_type = GPIO_INTR_DISABLE; //中断功能
gpio_config(&io_conf); //通过gpio_config函数初始化GPIO
//方法二
//gpio_pad_select_gpio(LED_R_IO); //选择GPIO
//gpio_set_direction(LED_R_IO, GPIO_MODE_OUTPUT); //指定哪个GPIO以什么方式工作
while (1)
{
//红灯亮
gpio_set_level(LED_R_IO, 0);
vTaskDelay(100 / portTICK_PERIOD_MS);
//红灯灭
gpio_set_level(LED_R_IO, 1);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
OK下面是代码的解释(个人理解,多指教!)。
代码解释
#define LED_R_IO 2
将LED_R_IO
定义为2
。LED_R_IO
是我们所定义的开发板上LED的引脚。在实际的物理连接中LED链接到2脚,所以在这里我们为了方便,整个宏定义用。
#define GPIO_OUTPUT_PIN_SEL (1ULL << LED_R_IO)
后缀ULL
以整数表示类型说明符。它的意思是unsigned long long
。
1ULL
修改了字面的1,并将其制成unsigned long long
(精度64位)。
这句话的意思是表示此配置对 GPIO2生效,采用位运算,然后将数值写入某个寄存器中……
做了个小实验:
后续中的两种方法
方法一调用gpio_config
函数,比较像32中的GPIO_Init();
函数。
方法二像Arduino中控制引脚的函数,封装的更彻底。
不过方法2可能会出现的更多一些,方法二不需要宏定义来选择引脚,而是使用gpio_pad_select_gpio(LED_R_IO);
来选择引脚。
未解决的问题
gpio.h在哪里导入进工程的……
读取引脚
也就一句话的事int gpio_get_level(gpio_num_t gpio_num);
启用内部上下拉
可以通过方法一结构体这一功能,同时也可以通过函数
gpio_set_pull_mode()
gpio_pullup_en()
gpio_pullup_dis()
gpio_pulldown_en()
gpio_pulldown_dis()
来进行单个控制
配置说明见上表
参考链接
ESP32 之 ESP-IDF 教学(一)——GPIO(1) GPIO配置及其简单操作。
第八章 ESP32驱动LED灯。
C在线工具。
第九章 ESP32的GPIO输入按键操作.