Ubuntu18.04 ESP32-S2 二次开发(1) - 开发环境搭建
Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED
Ubuntu18.04 ESP32-S2 二次开发(3)- 按键输入
Ubuntu18.04 ESP32-S2 二次开发(4)- 建立WIFI AP模式
Ubuntu18.04 ESP32-S2 二次开发(5)- 建立WIFI STA模式
Ubuntu18.04 ESP32-S2 二次开发(6)- 创建TCP客户端
···
Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED
-
- ···
- 操作原理
- ESP32 的 GPIO 接口介绍
- ESP32 的 GPIO API介绍
- ESP32 的 BLINK 例程
- ESP32-S2 LED代码解析
操作原理
对于任何一款芯片,GPIO接口是其最基本的组成部分,也是一款芯片入门的最基本操作。
如何搭建环境,之前的文章已详细讲解,此处不再赘述。参考:Ubuntu18.04 ESP32-S2 二次开发(1) - 开发环境搭建
我用的是安信可ESP12K开发板,开发板自带了一个LED,查看原理图,LED连接在了GPIO2上。
LED 灯的阳极都是通过电阻连接到ESP32的 GPIO引脚, 只要我们控制 GPIO
引脚的电平输出状态, 即可控制 LED 灯的亮灭。 接下来我们就需要操作GPIO2了。
ESP32 的 GPIO 接口介绍
官方API手册中介绍说ESP32-S2芯片有43个物理GPIO,每个IO可以用作通用I/O或可以连接到内部外设信号。截取一部分图如下所示:
ESP32 的 GPIO API介绍
设置 IO 模式函数: gpio_set_pull_mode();
函数原型 | gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull) |
---|---|
函数功能 | 设置 IO 模式 |
参数 | [in] gpio_num:引脚编号,0~34(存在部分) |
[in] pull:IO 模式,可以设置: | |
GPIO_MODE_DISABLE:不输入不输出 | |
GPIO_MODE_INPUT:输入模式 | |
GPIO_MODE_OUTPUT:输出模式 | |
GPIO_MODE_OUTPUT_OD:开漏输出模式 | |
GPIO_MODE_INPUT_OUTPUT_OD:开漏输入输出模式 | |
GPIO_MODE_INPUT_OUTPUT:输入输出模式 | |
返回值 | ESP_OK:成功 |
ESP_ERR_INVALID_ARG : 参数错误 |
设置 IO 输出值函数: gpio_set_level();
函数原型 | esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level) |
---|---|
函数功能 | 设置 IO 输出值 |
参数 | [in]gpio_num:引脚编号,0~34(存在部分) |
[in]pull:IO 模式,可以设置: | |
0:输出低 | |
1:输出高 | |
返回值 | ESP_OK:成功 |
ESP_ERR_INVALID_ARG : 参数错误 |
其他的API可参考官方API手册。
ESP32 的 BLINK 例程
在官方给的例程中,也给出了LED闪烁的例子,位置在/ESP-IDF/examples/get-started/blink , 我已截了一张全部的代码图
宏定义 #define BLINK_GPIO CONFIG_BLINK_GPIO 中的 CONFIG_BLINK_GPIO由menuconfig来映射到对应的IO。
下面来编译此工程,和之前搭建开发环境一样,注意的是要在menuconfig步骤修改IO的引脚,输入
idf.py menuconfig
在其中选择 Example Configuration(通过上下键选择)
然后回车键进入,将GPIO number改为对应连接到LED的IO,我对应开发板的IO是2,然后保存退出,再下载即可。
ESP32-S2 LED代码解析
官方给的ESP32-S2代码已经集成了Freertos实时操作系统,所以我们的代码都是在这基础上修改的。若是不了解Freertos,建议学习一下。
整个代码如下:
// An highlighted block
void app_main(void)
{
/* Configure the IOMUX register for pad BLINK_GPIO (some pads aremuxed to GPIO on reset already, but some default to otherfunctions and need to be switched to GPIO. Consult theTechnical Reference for a list of pads and their defaultfunctions.)*/gpio_reset_pin(BLINK_GPIO);/* Set the GPIO as a push/pull output */gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);while(1) {
/* Blink off (output low) */printf("Turning off the LED\n");gpio_set_level(BLINK_GPIO, 0);vTaskDelay(1000 / portTICK_PERIOD_MS);/* Blink on (output high) */printf("Turning on the LED\n");gpio_set_level(BLINK_GPIO, 1);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}
所有的代码入口都是 void app_main(void) ,这一点和我们写C程序int main入口不太一样,原因是在Freertos系统上运行,这一点不需要太多的解释。
接下来就是 gpio_reset_pin(BLINK_GPIO); ,先复位GPIO,然后设置GPIO输入输出功能:
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
BLINK_GPIO 是一个宏定义,取值由硬件的IO连接决定。
GPIO_MODE_OUTPUT 是输出模式
GPIO的设置就是这两句就完成了,然后就是while(1) 死循环,其中的延时函数是:
vTaskDelay(1000 / portTICK_PERIOD_MS);
建议用上面的写法,vTaskDelay是延时多少个时钟节拍。如果直接写1000,必然不是延时1000ms,因为ESP32-S2的freertos时钟节拍不是1ms。
gpio_set_level(BLINK_GPIO, 1);
gpio_set_level 函数用于设置IO的电平,这个也非常好理解。
总结一下,ESP32-S2的GPIO输出操作还是非常的简单。