24小(xiǎo)时联系電(diàn)话:18217114652、13661815404
中文(wén)
- 您当前的位置:
- 首页>
- 電(diàn)子资讯>
- 技术专题>
- ESP32 WiFi/蓝牙无線(xiàn)...
技术专题
ESP32 WiFi/蓝牙无線(xiàn)微控制器介绍
ESP32 WiFi/蓝牙无線(xiàn)微控制器介绍
ESP32 是一个非常通用(yòng)的片上系统 (SoC),可(kě)用(yòng)作通用(yòng)微控制器,具有(yǒu)相当广泛的外围设备,包括 WiFi 和蓝牙无線(xiàn)功能(néng)。
它由总部位于上海的乐鑫制造,成本不到 5 美元。虽然 ESP32 是一个 SoC,但大多(duō)数用(yòng)户不会从使用(yòng) ESP32 芯片本身开始。
图 1 – 实际的 ESP32 SoC
虽然可(kě)以使用(yòng) ESP32 SoC 设计产品,但这并不是一种常见的方法。相反,大多(duō)数基于 ESP32 的设计使用(yòng)预制模块,这些模块由实际的 ESP-32 SoC、外部闪存、晶體(tǐ)和预调谐 PCB 天線(xiàn)或 IPEX 天線(xiàn)连接器组成。
然后将整个组件放置在屏蔽罐下(图 2)。这个模块是乐鑫自己制作的,这个链接展示了几个版本。
使用(yòng)这个模块而不是从头开始设计的一大优势是乐鑫已经预加载了低级设备驱动程序、WiFi b、g、n、蓝牙和 BLE 的无線(xiàn)协议栈,以及作為(wèi)基础操作系统的 FreeRTOS。
此外,还加载了引导加载程序以允许相对容易地下载用(yòng)户应用(yòng)程序。
图 2 – ESP32 Wroom-32 模块
另一个通常称為(wèi) ESP32 的模块更恰当地称為(wèi) ESP32 开发模块。这基本上是一个安装在板上的 ESP32 模块,带有(yǒu)额外的支持電(diàn)路,例如稳压器和串行转 USB IC。
它允许直接连接到台式 PC,然后可(kě)用(yòng)于直接在该模块上编译、下载和运行程序。图 3 显示了来自不同制造商(shāng)的两个此类开发模块。
请注意,一个比另一个具有(yǒu)更多(duō) ESP 模块的引脚,并且价格稍贵。否则,它们非常相似。它们都允许通过 USB 電(diàn)缆直接连接到桌面开发系统。
图 3 – ESP32 开发模块示例
现在您已经了解了两种常用(yòng)的 ESP32 模块,您应该使用(yòng)哪一种?
推荐的方法是使用(yòng)开发板进行概念验证设计,因為(wèi)它是完全独立的。然后,当应用(yòng)程序开发得更充分(fēn),并且整个硬件设计已准备好集成时,切换到更紧凑的 ESP32 模块。
应用(yòng)程序代码可(kě)以使用(yòng)适配器板下载到 ESP32 模块(图 4)。它本质上提供了 ESP32 开发模块的所有(yǒu)功能(néng)。但目标是没有(yǒu)实际编程接口的 ESP32 模块,它是开发板的一部分(fēn)。
图 4 – 用(yòng)于将应用(yòng)程序代码下载到 ESP32 模块的编程器板
主要规格和特点:
处理(lǐ)器:
主处理(lǐ)器: Tensilica Xtensa 32位LX6微处理(lǐ)器
核心: 除ESP32-S0WD為(wèi)单核外,ESP32系列所有(yǒu)版本均為(wèi)双核。
时钟频率: 高达 240 MHz
性能(néng): 高达 600 DMIPS
超低功耗协处理(lǐ)器: 允许您在深度睡眠时进行 ADC 转换、计算和電(diàn)平阈值。
图 5 是该 SoC 的功能(néng)框图,摘自其数据表,可(kě)在乐鑫网站上获得。
图 5 – 数据表中 ESP32 的功能(néng)框图
无線(xiàn)连接:
Wi-Fi: 802.11 b/g/n/e/i(802.11n @ 2.4 GHz 高达 150 Mbit/s)
蓝牙: v4.2 BR/EDR 和蓝牙低功耗 (BLE)
记忆:
ROM: 448 KB – 用(yòng)于启动和核心功能(néng)
SRAM: 520 KB – 用(yòng)于数据和指令
RTC 快速 SRAM: 8 KB – 用(yòng)于从深度睡眠模式启动 RTC 期间的数据存储和主 CPU
RTC 慢速 SRAM: 8 KB – 用(yòng)于深度睡眠模式期间的协处理(lǐ)器访问
eFuse: 1 KBit – 其中 256 位用(yòng)于系统(MAC 地址和芯片配置),其余 768 位保留用(yòng)于客户应用(yòng),包括闪存加密和芯片 ID
嵌入式闪存:
0 MB(ESP32-D0WDQ6、ESP32-D0WD 和 ESP32-S0WD 芯片)
2 MB(ESP32-D2WD 芯片)
4 MB(ESP32-PICO-D4 SiP 模块)
Flash memory 通过 ESP32-D2WD 和 ESP32-PICO-D4 上的 IO16、IO17、SD_CMD、SD_CLK、SD_DATA_0 和 SD_DATA_1 内部连接。
外部闪存和 SRAM: ESP32 支持多(duō)达四个 16 MB 的外部 QSPI闪存和 SRAM,具有(yǒu)基于 AES 的硬件加密,以保护开发人员的程序和数据。ESP32 可(kě)以通过高速缓存访问外部 QSPI flash 和 SRAM。
高达 16 MB 的外部闪存存储器映射到 CPU 代码空间,支持 8 位、16 位和 32 位访问。支持从闪存执行代码。
多(duō)达 8 MB 的外部闪存/SRAM 存储器映射到 CPU 数据空间,支持 8 位、16 位和 32 位访问。闪存和 SRAM 支持数据读取。SRAM 支持数据写入。
请注意,ESP32 芯片内嵌 Flash 不支持外部 Flash 与外设的地址映射。
外设输入/输出: ESP32 提供了丰富的 DMA 外设接口,包括:
電(diàn)容式触控
ADC(模数转换器)
DAC(数模转换器)
I²C(内部集成電(diàn)路)
UART(通用(yòng)异步接收器/发送器)
CAN 2.0(控制器局域网)
SPI(串行外设接口)
I²S(集成 Inter-IC 声音)
RMII(简化的媒體(tǐ)独立接口)
PWM(脉宽调制)等。
安全:
支持 IEEE 802.11 标准安全功能(néng),包括 WFA、WPA/WPA2 和 WAPI
安全启动
闪存加密
1024位OTP,客户最高768位
加密硬件加速:AES、SHA-2、RSA、椭圆曲線(xiàn)加密(ECC)、随机数生成器(RNG)
為(wèi) ESP32 开发应用(yòng)程序
开发任何嵌入式系统的通常方法是首先选择适合所需硬件要求的合适的微控制器或微控制器模块,同样重要的是,具有(yǒu)合适的软件开发支持。
开发了用(yòng)于测试应用(yòng)程序代码的原型硬件平台。然后,可(kě)以开始应用(yòng)软件开发过程。
假设已经选择ESP32作為(wèi)微控制器模块,下一步就是实际搭建一个可(kě)以开发和测试应用(yòng)代码的环境。
為(wèi)嵌入式系统开发应用(yòng)程序是一个迭代过程,通常需要在交叉开发平台上进行设置,从而可(kě)以编写、编译、链接代码并将其加载到处理(lǐ)器中。
硬件测试后,重复整个过程,直到达到最终的性能(néng)要求。
整个过程通常在集成开发环境 (IDE) 中执行,该环境至少应提供以下内容: 用(yòng)于编写应用(yòng)程序代码的文(wén)本编辑器;编译器/链接器/定位器;加载器将编译后的二进制代码下载到目标处理(lǐ)器中的正确物(wù)理(lǐ)地址段。
IDE 通常还包括某种功能(néng),可(kě)以自动完成整个周期。
这很(hěn)复杂,需要单独安装文(wén)件编辑器和构建工具。但是,就能(néng)够编写最紧凑、最快的代码而言,它提供了最佳性能(néng)。
例如,它提供对 ESP-32 应用(yòng)程序编程接口 (API) 的完全访问权限。
使用(yòng)不应打折的 IDF 的替代方法是使用(yòng) Arduino。无论是使用(yòng) Arduino IDE 还是其他(tā)一些 IDE,在 Arduino 框架中开发 ESP32 应用(yòng)程序几乎可(kě)以完成 ESP32 IDF 所做的一切,但學(xué)习曲線(xiàn)不那么陡峭。它还具有(yǒu)在大多(duō)数情况下可(kě)以接受的性能(néng)损失。
ESP32 Arduino 内核实际上是建立在 ESP32 IDF 之上的。它提供了一个额外的抽象层,在大多(duō)数应用(yòng)程序中可(kě)以简化和加速开发。
已经有(yǒu)很(hěn)多(duō)关于如何安装 Arduino IDE 以及如何安装任何板(例如 ESP32)的文(wén)章。还有(yǒu)很(hěn)多(duō)库可(kě)用(yòng)于帮助开发 ESP32 的各种应用(yòng)程序。
本文(wén)的其余部分(fēn)将重点介绍 ESP32 的一个方面,该方面通常不被大多(duō)数 Arduino 应用(yòng)程序利用(yòng)——ESP32 原生的 FreeRTOS。
几乎所有(yǒu)的 Arduino 应用(yòng)程序都只有(yǒu)一个 setup() 和一个 loop() 函数。由于 ESP32 运行 FreeRTOS,因此它具有(yǒu)很(hěn)强的多(duō)任務(wù)处理(lǐ)能(néng)力。
ESP32 还是一款功能(néng)强大且速度快的微控制器,具有(yǒu)大量闪存和 SRAM。运行多(duō)个線(xiàn)程不仅非常可(kě)行,而且实际上可(kě)以简化和增强一些应用(yòng)程序代码。
作為(wèi)一个简单的例子,考虑一个用(yòng)户希望内置 LED 在应用(yòng)程序运行时持续闪烁。
下面的代码示例显示了这种尝试。不幸的是,由于代码是顺序执行的,ledBlink() 函数会占用(yòng)所有(yǒu)处理(lǐ)器资源,并且运行的代码永遠(yuǎn)不会退出 setup() 函数。这意味着用(yòng)户应用(yòng)程序永遠(yuǎn)不会运行。
通过将 ledBlink() 函数作為(wèi)定时器中断的一部分(fēn)运行,可(kě)以使其正常运行。然而,在主应用(yòng)程序运行时,仅仅使用(yòng)一个计时器来使 LED 在后台闪烁会浪费处理(lǐ)器资源。现在,想象一下是否必须使多(duō)个 LED 以不同的速率闪烁。执行此操作所需的代码部分(fēn)可(kě)能(néng)会变得非常复杂:
void setup()
{
// Setup code for the user application here ….
// Start the LED flashing
ledFlash();
}
void loop()
{
// Put user application here ….
}
// Simple LED flash function
void ledFlash()
{
// Initialize digital pin LED_BUILTIN as an output. For the ESP32, LED_BUILTIN is usually
// 2, meaning GPIO2.
pinMode(LED_BUILTIN, OUTPUT);
while(1)
{
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on (HIGH is the voltage level)
delay(1000); // Wait for a second
digitalWrite(LED_BUILTIN, LOW); // Turn the LED off by making the voltage LOW
delay(1000); // Wait for a second
}
}
更好的方法是将 LED 闪烁功能(néng)作為(wèi)一项完全独立的任務(wù)实际运行。接下来的几个函数展示了如何使用(yòng) ESP32 上免费提供的 FreeRTOS API 来实现这一点。
请注意,在 setup() 函数中,创建了使 LED 闪烁的任務(wù)。在此之后,任務(wù)将永遠(yuǎn)运行,或者直到通过调用(yòng)使用(yòng) FreeRTOS vTaskDekete() 函数删除任務(wù)而停止。
例如,通过这种方法,现在可(kě)以让多(duō)个 LED 以不同的速率闪烁。只需按照此处使用(yòng)的相同方法创建更多(duō)任務(wù)。只需為(wèi)每个 LED 选择不同的 IO 端口。
该应用(yòng)程序仍将作為(wèi)其自己的独立任務(wù)完全独立运行。甚至可(kě)以选择双核 ESP32 的哪个内核来运行每个任務(wù)。
例如,如果应用(yòng)程序不需要无線(xiàn)功能(néng)(通常在 ESP32 的内核 0 上运行),那么它可(kě)用(yòng)于闪烁 LED,内核 1 可(kě)专用(yòng)于运行应用(yòng)程序。可(kě)在此处找到 ESP32 的 FreeRTOS API 。
void setup()
{
// Setup code for the user application here ….
// Set up the LED flashing as a separate task.
// From this point on, the LED will flash in the background
ledTaskSetup(void)
}
void loop()
{
// Put user application here ….
}
// That’s the LED flash task that will run as a separate thread.
void ledFlash(void *pvParameters)
{
while(1) // The thread must never exit.
{
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on
vTaskDelay(pdMS_TO_TICKS((1000))); // Better version of delay(1000) using FreeRTOS
digitalWrite(LED_BUILTIN, LOW); // Turn the LED off
vTaskDelay(pdMS_TO_TICKS((1000))); // Better version of delay(1000) using FreeRTOS
}
} // End ledFlash
// Task setup function. Calls xTaskCreate to actually create a new task.
void ledTaskSetup(void)
{
// Set up digital IO ports to control the LED’s,
pinMode(LED_BUILTIN, OUTPUT);
// Create a separate thread to handle LED flashing
xTaskCreate(
ledFlash, // Function that implements the task.
“LED_Flash”, // Text name for the task.
1000, // Stack size in bytes, not words.
NULL, // Parameter passed into the task.
1, // Priority at which the task is created.
NULL); // Used to pass out the created task’s handle.
} // End ledTaskSetup
本文(wén)绝不是对 ESP32 的详尽描述。但您现在应该了解它的一些重要功能(néng)。
这些特性加上广泛的可(kě)用(yòng)性和低成本,使 ESP32 成為(wèi)需要良好支持的处理(lǐ)平台的嵌入式无線(xiàn)应用(yòng)的有(yǒu)力竞争者。