前言
立创开发板之前出了个ESP32S3R8N8的开发板,当时嫖了个优惠券,九块九拿下了。
现在不仅是35.9一个,而且还没货。
如果真的想要的小伙伴可以自己去打板焊一个,人家开源了(目测难度较大,反正我是焊不上去的)。
立创·ESP32S3R8N8开发板 - 嘉立创EDA开源硬件平台立创·ESP32S3R8N8开发板 - 嘉立创EDA开源硬件平台,开源广场汇集了多种类型的电路设计工程,快速实现资源共享!https://oshwhub.com/li-chuang-kai-fa-ban/li-chuang-esp32s3r8n8-kai-fa-ban前阵子在忙别的事,然后这块板子一直在吃灰,最近没啥事就拿了起来。跟着人家立创官方的文档学一学。
之前出了Arduino的快速上手ESP8266(其实ESP32也差不多,基本通用,就是提供给ESP32的库函数更丰富一些,比较ESP32比ESP8266强大太多了嘛),前阵子还出了MicroPython的快速上手ESP32,那么今天就来出个基于ESP-IDF的快速上手ESP32。
不过这次就不能是一文速通了,因为这个ESP-IDF有点像STM32的固件库,值得说一说的地方还挺多的。
ESP-IDF
我们先问问文心一言,这个ESP-IDF是个什么东西。
总而言之,ESP-IDF就是帮助我们开发ESP系列芯片的一个框架,我们使用它,即可发挥出ESP32的全部威力(没错,我的意思就是Arduino和MicroPython都不如ESP-IDF,但是Arduino和MicroPython会相对而言简单很多)
我们需要先配置好ESP-IDF的环境。
配置环境
首先先下载安装VSCode,这个下载安装直接一路next即可,记得更换默认安装路径。
接着下载ESP-IDF离线安装包。
https://dl.espressif.cn/dl/esp-idf/https://dl.espressif.cn/dl/esp-idf/选择第二个下载,或者关注我的公众号“折途想要敲代码”回复关键词“ESP32”即可免费下载关于ESP32的所有我打包好的资料。
下载之后直接执行正常安装即可,在选择组件的界面的时候,取消勾选开发集成(因为我们不需要)。安装的时候记得关闭VSCode。
安装完毕之后打开VSCode,去拓展那边下载好ESP-IDF的插件。
然后进入命令面板。
输入
configure esp-idf extension
等待一会进入到下面的这个界面,选择最下面的选项。
接着安装ESP-IDF,一般是会直接显示出来我们之前安装过的,如果没显示出来,那么手动配置一下路径,接着等待安装完毕即可。
GPIO
关于ESP-IDF中如何使用GPIO,可以查阅文档(有时候可能需要魔法)。
GPIO & RTC GPIO - ESP32 - — ESP-IDF 编程指南 v5.2.1 文档https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/peripherals/gpio.html
ESP32中关于GPIO最屌的就是交换矩阵,通过交换矩阵,我们的GPIO可以任意分配到我们想要用的外设上,例如STM32中的UART的引脚是固定的,但是ESP32中UART的引脚却可以通过交换矩阵任意指定,这是非常厉害的地方,我单方面宣布在这个地方ESP32完胜STM32。
上面是官方的技术文档中的特性介绍。
有一个有些矛盾的地方,就是ESP-IDF编程指南和ESP32S3的技术手册中关于GPIO口数量的描述。
技术手册中是说有45个通用GPIO管脚,其中0~21,26~48既可输入也可输出。
而在编程指南中描述又变了,当然也可能是我理解错了。
刚刚把交换矩阵捧上天了,但实际上我们分配GPIO口的时候并不能完全的随心所欲。
同上所说,我们有些管脚并不能随意分配。例如34~39引脚只能配置为输入模式,且不具备软件使能上拉或下拉功能。
以及使用WiFi的时候不能使用ADC。
另外需要提一下的是,我用的这款立创开发板出的ESP32S3R8N8把UART0给充公拿去用作烧录程序用了,因此用这款开发板的时候最好就不要使用UART0了。
使用函数
#include "driver/gpio.h"
首先先是包含上面的头文件。
我开头说过,ESP-IDF跟STM32的固件库还是有点像的,使用GPIO口首先我们就需要先配置GPIO口。
同样是传入一个结构体变量的指针,通过传入的结构体的成员参数来配置GPIO。
这个结构体类型的成员参数有以下几个。
我们来看看应该如何填写这些参数。
上表的说明应该已经很详细了,那我就打个样,看看我们点个灯应该如何配置。
#include "driver/gpio.h"
void initGPIO(){
gpio_config_t init;
init.intr_type=GPIO_INTR_DISABLE; //失能中断;
init.mode=GPIO_MODE_OUTPUT; //输出模式
init.pin_bit_mask=(1ULL<<18); //GPIO18
init.pull_down_en=GPIO_PULLDOWN_DISABLE; //失能下拉模式
init.pull_up_en=GPIO_PULLUP_ENABLE; //使能上拉模式
gpio_config(&init);
}
配置完之后我们就可以使其输出高电平或者是低电平了。
以上函数是输出或者是获取输入的函数,都比较简单,编程指南中说的也比较清楚。
那么至此我们就可以点灯了,但是我们想要让它闪烁起来,那么还需要看看延时函数怎么使用。
延时函数
这个我们包含一个头文件。
#include <unistd.h>
然后使用usleep函数,参数写入要延时的微秒即可延时。
知道怎么延时之后,那么我们就直接开始让LED闪烁。
#include "driver/gpio.h"
#include <unistd.h>
void initGPIO(){
gpio_config_t init={
.intr_type=GPIO_INTR_DISABLE, //失能中断;
.mode=GPIO_MODE_OUTPUT, //输出模式
.pin_bit_mask=(1ULL<<18), //GPIO18
.pull_down_en=GPIO_PULLDOWN_DISABLE, //失能下拉模式
.pull_up_en=GPIO_PULLUP_ENABLE, //使能上拉模式
};
gpio_config(&init);
}
void app_main(void){
initGPIO();
while(1){
gpio_set_level(18,0);
usleep(500*1000); //1000us是一个ms,延时500个ms,可以另外封装成毫秒延时函数
gpio_set_level(18,1);
usleep(500*1000);
}
}
那么我们通过上面的代码就成功地让LED闪烁了起来。
参考
Docshttps://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8gGPIO & RTC GPIO - ESP32 - — ESP-IDF 编程指南 v5.2.1 文档https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/peripherals/gpio.html《esp32-s3_datasheet_cn.pdf》
《esp32-s3_technical_reference_manual_cn.pdf》