摘要
在装好开发环境的前提下(vscode+ESP-IDF),利用插件创建模板工程,编写main.c文件,实现ESP32的GPIO输出控制
一、引用到的库函数
这里目前我只能例举出来,做一些简单的介绍,因为和之前接触的开发板有比较大的不同,所有使用的库函数皆为乐鑫官方提供(非官方会标注)
1、driver/gpio.h
ESP32的GPIO控制库,声明了关于GPIO控制的一些函数
2、freertos/FreeRTOS.h
不了解,但不包含编译不过(后续补充)
3、freertos/task.h
不了解,但是使用到了其中的一个函数
vTaskDelay();
二、使用到的函数
1、gpio_pad_select_gpio(uint32_t gpio_num);
类似于一个声明,声明你要使用的GPIO端口
例如你要使用GPIO2
gpio_pad_select_gpio(2);
2、gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode);
GPIO口的类型设定,在ESP32官方库里面给出了一下几种类型
- GPIO_MODE_DISABLE (不可以输入也不可以输出)
- GPIO_MODE_INPUT (只可以输入)
- GPIO_MODE_OUTPUT (只可以输出)
- GPIO_MODE_OUTPUT_OD
- GPIO_MODE_INPUT_OUTPUT_OD
- GPIO_MODE_INPUT_OUTPUT
这里只说明第1-3种,其他后续补充
示例:
将2号口设为输出端口
gpio_set_direction(2,GPIO_MODE_OUTPUT);
3、gpio_set_level(gpio_num_t gpio_num, uint32_t level);
设置gpio电平等级的函数
level有两种状态0和1
示例:
将2号端口的电平等级设置为1
gpio_set_level(2,1);
4、vTaskDelay(const TickType_t xTicksToDelay);
延时函数,是freertos这个实时操作系统里面的函数,没学过,这里会用就行了
在使用这个函数的时候需要注意。
在下面的那种用法中,延时的量级是ms,1000ms即为1s延时;
示例:
延迟1s
vTaskDelay(1000/portTICK_PERIOD_MS);
其中对portTICK_PERIOD_MS的除法运算不能省略,原因暂时我不知道,但是去掉该运算后延时时间会不对(后续回了再修改)
查询到portTICK_PERIOD_MS的定义值为1,但是直接除1也不正确,各位可以试试,也许我是个例
三、demo
板载led延时1ms闪烁(更古不变的入门程序)
main.c
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define LED_PIN GPIO_NUM_2
void app_main(void)
{
gpio_pad_select_gpio(LED_PIN);
gpio_set_direction(LED_PIN,GPIO_MODE_OUTPUT);
gpio_set_level(LED_PIN,0);
while(1){
gpio_set_level(LED_PIN,1);
vTaskDelay(1000/portTICK_PERIOD_MS);
gpio_set_level(LED_PIN,0);
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}