参考:(正点原子)DNESP32S3 V1.0 硬件参考手册、(正点原子)DNESP32S3使用指南-Arduino版本_V1.1、ESP32-S3 技术规格书、(正点原子)标准例程-Arduino版
1. 综述:
1.1 资料获取
在Arduino 官网中找到官方开发板资料和Arduino 函数说明:
- 打开Arduino 官网 ;
- 点击Documentation;
- 点击Tutorials;
- 搜索关键字“ESP32”
乐鑫公司提供的 arduino_esp32库的资料:
https://github.com/espressif/arduino-esp32
这是乐鑫公司专门为了 ESP32 能在 Arduino IDE 软件上运行专门编写的库包。后续在 Arduino IDE 上开发 ESP32 是依靠该库包,并不是 Arduino 官方提供的 Arduino ESP32 Boards 软件包
正点原子的学习资料:
http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html
1.2 Arduino 简介
Arduino(Arduino Integrated Development Environment 、集成开发环境)是一个开源电子原型平台,由硬件和软件组成,旨在让任何人都能轻松创建交互式电子项目;
简单来说,只要是搭载 Arduino 支持芯片的开发板都可以称为 Arduino 开发板。目前支持 Arduino 开发的芯片有很多,比如 Mega 系列芯片(Mega328p/Mega2560/Mega32u4 等)、STM32 系列芯片(STM32F0/F1/F2/F3/F4/F7/H7 等)、ESP 系列芯片(esp32/esp32s2/esp32c3/esp32s3 等)以及树莓派系列芯片等。
这里的实质就是有每个系列芯片对应要有一个 Arduino 库,比如乐鑫官方的arduino-esp32 库,ST 的 stm32duino 库,只要在 Arduino 安装这种芯片库便可以使用 Arduino 的语法在 Arduino IDE 上对芯片进行开发。
- –
- Arduino IDE 可以在 Windows、Mac OS 和 Linux 三大主流操作系统上运行;
- Arduino 使用 C/C++语言编写程序,以下是在不同框架内开发的例程:
- 在使用 ESP-IDF(乐鑫科技开发的官方物联网开发框架)对 ESP32 进行开发中,将一个 I/O 口设置为输出高电平状态需要以下操作:
gpio_set_direction(GPIO_NUM_1, GPIO_MODE_OUTPUT);
gpio_set_level(GPIO_NUM_1, PIN_SET);
- 在 Arduino 中,采用的是如下代码去设置 IO 口输出高电平:
PinMode(1, OUTPUT);
digitalWrite(1, HIGH);
- 在 Arduino 程序的应用层中,是没有 main 函数的,这跟传统的 C/C++程序结构有所不同。在进行 Arduino 开发时一般不直接操作 main 函数,而使用 setup()和 loop()这两个函数:
void setup() {
// 在这里填写 setup 函数代码,它只会运行一次
}
void loop() {
// 在这里编写 loop 函数代码,它会不断重复运行
}
1.2.1 Arduino 开发环境搭建
ESP32 的开发方式主要有三种:ESP-IDF、Arduino 和 MicroPython:
- ESP-IDF:ESP-IDF 是乐鑫官方推出的开发框架,专门为 ESP32 和其他一些 ESP 系列芯片设计。它提供了一套完整的开发工具和库,可以帮助开发者快速地开发和调试 ESP32 应用程序。ESP-IDF 支持 C/C++语言,并提供了一套完整的 API,可以控制 ESP32 的各种功能和外设。此外,ESP-IDF 还提供了一个在线编译器和调试器,可以让开发者在云端进行开发和调试。
- Arduino:Arduino 是一种流行的开源电子原型平台,包括一系列的开发板和开发环境。Arduino 提供了一种基于 C/C++的语言,使得开发者可以更容易地控制和编程 ESP32。Arduino开发环境还提供了大量的库和函数,可以帮助开发者快速地构建和测试他们的代码。Arduino 还支持图形化编程,使得初学者和非专业人士也可以轻松地进行开发。本教程选择此开发方式。
- MicroPython:MicroPython 是一种精简的 Python 3 语言,可以运行在 ESP32 和其他一些微控制器上。它提供了一种简单的方式来编程和控制 ESP32,而且由于 Python 是一种高级语言,它使得开发过程相对快速和简单。开发者可以使用 MicroPython 进行快速原型设计和开发,并且由于 Python 是一种解释型语言,所以可以直接在 ESP32 上运行代码,无需进行编译。
-
软件下载与安装:到Arduino 官网下载并安装软件;
-
配置首选项:文件 - 首选项:
1.2.2 安装 arduino-esp32 库
- 到https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls搜索ESP32,找到如下链接:
- 在IDE 中的首选项中的“其他开发板管理器地址”中添加:
- 此时在本机路径“C:\Users\用户名\AppData\Local\Arduino15”中会多出一个文件“package_esp32_index.json”;
- 将12个离线库文件复制粘贴到路径“C:\Users\用户名\AppData\Local\Arduino15\staging\packages”
- 回到IDE,在侧边栏开发板管理器中,搜索“ESP32”,选择对应版本点安装,即可完成本地库安装;(注意版本要和本地库版本一致)
如果网络允许,可直接点击上图“安装”,完成在线安装;
- 安装完成后,在对应路径即可看到esp32 的库文件夹:
在开发板选项中,也多了esp32的选项;
1.2.3 完成开发板配置
- 选择开发板:工具 - 开发板 - esp32 - ESP32S3 Dev Module;
- 此后,工具栏则多了很多配置项,配置完成后如下图:
配置参数说明可查看该网站https://www.corvin.cn/3258.html
1.2.4 工程内全局搜索
1.3 ESP32简介
ESP32是乐鑫公司开发的物联网芯片:
ESP32官方选型页面
1.3.1 ESP32-S3
ESP32-S3 是一款由乐鑫公司开发的物联网芯片:
- 架构和性能:ESP32-S3 采用 Xtensa® LX7 CPU,这是一个哈佛结构的双核系统。它具有独立的指令总线和数据总线,所有的内部存储器、外部存储器以及外设都分布在这两条总线上。这种架构使得 CPU 可以同时读取指令和数据,从而提高了处理速度。
- 存储:ESP32-S3 具有丰富的存储空间。它内部有 384 KB 的内部 ROM,512 KB 的内部SRAM,以及 8 KB 的 RTC 快速存储器和 8 KB 的 RTC 慢速存储器。此外,它还支持最大 1 GB的片外 FLASH 和最大 1 GB 的片外 RAM。
- 外设:ESP32-S3 具有许多外设,总计有 45 个模块/外设。其中 11 个具有 GDMA(Generic DMA)功能,可以用来进行数据块的传输,减轻 CPU 的负担,提高整体性能。
- 通信:ESP32-S3 同时支持 WIFI 和蓝牙功能。在 2.4GHz 频带支持 20MHz 和 40MHz 频宽。
- 向量指令:ESP32-S3 增加了用于加速神经网络计算和信号处理等工作的向量指令。这些向量指令可以大大提高芯片在 AI 方面的计算速度和效率。
ESP32-S3 资源简介:
乐鑫 S3 系列型号包括 ESP32-S3、ESP32-S3R2、ESP32-S3R8 和 ESP32-S3FN8 等,不同型号的 MCU 有不同的应用场景,这些型号的命名规则如下:
以ESP32-S3FH4R2这一芯片为例:
1.3.2 S3 系列模组
除了 S3 系列的芯片之外,乐鑫还推出了 S3 系列的模组,它是 S3 系列芯片的简易系统。乐鑫 S3 系列模组是基于 S3 系列芯片的子系统,它已经设计好了外围电路,简化了开发过程,让开发者可以更快速地使用 S3 系列芯片进行开发。
乐鑫推出了 ESP32-S3-WROOM-1 和 ESP32-S3-WROOM-1U 两款通用型 Wi-Fi+低功耗蓝牙MCU 模组,如下图所示,它们搭载 ESP32-S3 系列芯片。除具有丰富的外设接口外,模组还拥有强大的神经网络运算能力和信号处理能力,适用于 AIoT 领域的多种应用场景,例如唤醒词检测和语音命令识别、人脸检测和识别、智能家居、智能家电、智能控制面板、智能扬声器等。
可见,ESP32-S3-WROOM-1 采用 PCB 板载天线,而 ESP32-S3-WROOM-1U 采用连接器连接外部天线。两款模组均有多种芯片型号可供选择,具体见下表所示:
1.4 boot 启动流程
从宏观上,该启动流程可分为如下 3 个步骤:
- 一级引导程序,它被固化在 ESP32-S3 内部的 ROM 中,它会从 flash 的 0x00 处地址加载二级引导程序至 RAM 中。
- 二级引导程序从 flash 中加载分区表和主程序镜像至内存中,主程序中包含了 RAM 段和通过 flash 高速缓存映射的只读段。
- 应用程序启动阶段运行,这时第二个 CPU 和 freeRTOS 的调度器启动,最后进入app_main 函数执行用户代码。
1.5 Arduino-esp32 库
Arduino-esp32 库是一个在 Arduino 平台上开发 ESP32 的插件,它为 Arduino 环境下的ESP32 芯片提供了支持。它允许使用熟悉的 Arduino 函数和库编写代码,并直接在 ESP32 上运行。
Arduino-esp32 库支持对 ESP32、ESP32-S2、ESP32-S3、ESP32-C3、ESP32-C6 和 ESP32-H2进行开发,还提供了很多基础库:
3. GPIO
对于 ESP32-S3 模组引出的 IO,每个管脚都可用作一个通用 IO,或连接一个内部外设信号;
GPIO 口输出来的信号是以 0,1 表示的不连续数字信号。在 Arduino 中数字信号用高低电平来表示,高电平为数字信号 1,低电平为数字信号 0;Arduino 输出的低电平为 0V,输出的高电平为当前 Arduino 的工作电压,对于 ESP32-S3 模组的工作电压为 3.3V,则其高电平为 3.3V;
3.1 核心代码
新建工程后,选择对应串口和对应芯片:
- 硬件上使用IO1控制LED,IO0控制按钮;
- 新建一个工程,新建“led.h”头文件,并编写:
#define LED_PIN 1
void led_init(void)
{
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
}
- 新建一个工程,新建“key.h”头文件,并编写:
#define KEY_PIN 0
#define KEY digitalRead(KEY_PIN) /* 读取 KEY 引脚的状态 */
void key_init(void)
{
/* 结合原理图设计,按键没有按下时,KEY 引脚检测到的是高电平 */
pinMode(KEY_PIN, INPUT_PULLUP); /* 设置 key 引脚为上拉输入模式 */
}
- 在工程文件中编写:
#include "led.h"
#include "key.h"
#define LED(x) digitalWrite(LED_PIN, x)
#define LED_TOGGLE() digitalWrite(LED_PIN, !digitalRead(LED_PIN))
void setup() {
// put your setup code here, to run once:
led_init(); /* LED 初始化 */
key_init(); /* KEY 初始化 */
}
void loop() {
if (KEY == 0) /* 读取 KEY 状态,如果按下 KEY */
{
delay(10);
if (KEY == 0)
{
LED(0); /* LED 引脚输出接低电平,点亮 */
}
}
else /* 读取 KEY 状态,如果 KEY 没有按下 */
{
LED(1); /* LED 引脚输出接高电平,熄灭 */
}
}
- 点击IDE 上传按钮,编译通过后,即烧录到ESP32中,观察效果;
4. 中断
外部中断是由外部设备发起请求的中断。
每个中断对应一个中断程序,中断程序可以看作一段独立于主程序之外的程序,也称为中断回调函数。
当中断被触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序。当中断程序运行完毕,则返回到先前主程序暂停的位置,继续运行主程序,如此便可达到实时响应处理事件的效果。
ESP32-S3 的中断:ESP32-S3 有 99 个外部中断源,但是 CPU0 或 CPU1 只能够处理 32 个中断。ESP32-S3 将外部中断映射到 CPU0 或 CPU1 中断就需要用到中断矩阵。
ESP32-S3 中断矩阵会将任一外部中断源单独分配到双核 CPU 的任一外部中断上,以便在外设中断信号产生后,及时通知 CPU0 或 CPU1 进行处理。
ESP32-S3 的中断模式:
4.1 核心代码
attachInterrupt
:该函数功能是指定中断引脚,并对中断引脚进行初始化设置;
void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode);
/*
参数 pin 为要设置中断触发输入的引脚,ESP32-S3 所有引脚均可以配置为外部中断引脚。
参数 handler 为中断回调函数,当引脚中断触发时,会终止当前运行的程序,转而执行该程序。
参数 mode 为 5 种中断触发模式
*/
// 很多时候,attachInterrupt 函数的使用也采用以下方式。
attachInterrupt(digitalPinToInterrupt(pin), handler, mode);
/* 在一些 Arduino 开发板中比如 Arduino Uno、Leon