24小时联系电话:18217114652、13661815404

中文

您当前的位置:
首页>
电子资讯>
技术专题>
ESP32 WiFi/蓝牙无线...

技术专题

ESP32 WiFi/蓝牙无线微控制器介绍


ESP32 WiFi/蓝牙无线微控制器介绍

ESP32 是一个非常通用的片上系统 (SoC),可用作通用微控制器,具有相当广泛的外围设备,包括 WiFi 和蓝牙无线功能。

它由总部位于上海的乐鑫制造,成本不到 5 美元。虽然 ESP32 是一个 SoC,但大多数用户不会从使用 ESP32 芯片本身开始。


1 – 实际的 ESP32 SoC

虽然可以使用 ESP32 SoC 设计产品,但这并不是一种常见的方法。相反,大多数基于 ESP32 的设计使用预制模块,这些模块由实际的 ESP-32 SoC、外部闪存、晶体和预调谐 PCB 天线或 IPEX 天线连接器组成。

然后将整个组件放置在屏蔽罐下(图 2)。这个模块是乐鑫自己制作的,这个链接展示了几个版本。

使用这个模块而不是从头开始设计的一大优势是乐鑫已经预加载了低级设备驱动程序、WiFi bgn、蓝牙和 BLE 的无线协议栈,以及作为基础操作系统的 FreeRTOS

此外,还加载了引导加载程序以允许相对容易地下载用户应用程序。


2 – ESP32 Wroom-32 模块

另一个通常称为 ESP32 的模块更恰当地称为 ESP32 开发模块。这基本上是一个安装在板上的 ESP32 模块,带有额外的支持电路,例如稳压器和串行转 USB IC

它允许直接连接到台式 PC,然后可用于直接在该模块上编译、下载和运行程序。图 3 显示了来自不同制造商的两个此类开发模块。

请注意,一个比另一个具有更多 ESP 模块的引脚,并且价格稍贵。否则,它们非常相似。它们都允许通过 USB 电缆直接连接到桌面开发系统。


3 – ESP32 开发模块示例

现在您已经了解了两种常用的 ESP32 模块,您应该使用哪一种?

推荐的方法是使用开发板进行概念验证设计,因为它是完全独立的。然后,当应用程序开发得更充分,并且整个硬件设计已准备好集成时,切换到更紧凑的 ESP32 模块。

应用程序代码可以使用适配器板下载到 ESP32 模块(图 4)。它本质上提供了 ESP32 开发模块的所有功能。但目标是没有实际编程接口的 ESP32 模块,它是开发板的一部分。


4 – 用于将应用程序代码下载到 ESP32 模块的编程器板

主要规格和特点:

处理器:

主处理器:  Tensilica Xtensa 32LX6微处理器

核心: ESP32-S0WD为单核外,ESP32系列所有版本均为双核。

时钟频率: 高达 240 MHz

性能: 高达 600 DMIPS

超低功耗协处理器: 允许您在深度睡眠时进行 ADC 转换、计算和电平阈值。

5 是该 SoC 的功能框图,摘自其数据表,可在乐鑫网站上获得。


5 – 数据表中 ESP32 的功能框图

无线连接:

Wi-Fi  802.11 b/g/n/e/i802.11n @ 2.4 GHz 高达 150 Mbit/s

蓝牙:  v4.2 BR/EDR 和蓝牙低功耗 (BLE)

记忆:

ROM  448 KB – 用于启动和核心功能

SRAM  520 KB – 用于数据和指令

RTC 快速 SRAM  8 KB – 用于从深度睡眠模式启动 RTC 期间的数据存储和主 CPU

RTC 慢速 SRAM  8 KB – 用于深度睡眠模式期间的协处理器访问

eFuse  1 KBit – 其中 256 位用于系统(MAC 地址和芯片配置),其余 768 位保留用于客户应用,包括闪存加密和芯片 ID

嵌入式闪存:

0 MBESP32-D0WDQ6ESP32-D0WD ESP32-S0WD 芯片)

2 MBESP32-D2WD 芯片)

4 MBESP32-PICO-D4 SiP 模块)

Flash memory 通过 ESP32-D2WD ESP32-PICO-D4 上的 IO16IO17SD_CMDSD_CLKSD_DATA_0 SD_DATA_1 内部连接。

外部闪存和 SRAM  ESP32 支持多达四个 16 MB 的外部 QSPI闪存和 SRAM,具有基于 AES 的硬件加密,以保护开发人员的程序和数据。ESP32 可以通过高速缓存访问外部 QSPI flash SRAM

高达 16 MB 的外部闪存存储器映射到 CPU 代码空间,支持 8 位、16 位和 32 位访问。支持从闪存执行代码。

多达 8 MB 的外部闪存/SRAM 存储器映射到 CPU 数据空间,支持 8 位、16 位和 32 位访问。闪存和 SRAM 支持数据读取。SRAM 支持数据写入。

请注意,ESP32 芯片内嵌 Flash 不支持外部 Flash 与外设的地址映射。

外设输入/输出:  ESP32 提供了丰富的 DMA 外设接口,包括:

电容式触控

ADC(模数转换器)

DAC(数模转换器)

I²C(内部集成电路)

UART(通用异步接收器/发送器)

CAN 2.0(控制器局域网)

SPI(串行外设接口)

I²S(集成 Inter-IC 声音)

RMII(简化的媒体独立接口)

PWM(脉宽调制)等。

安全:

支持 IEEE 802.11 标准安全功能,包括 WFAWPA/WPA2 WAPI

安全启动

闪存加密

1024OTP,客户最高768

加密硬件加速:AESSHA-2RSA、椭圆曲线加密(ECC)、随机数生成器(RNG

ESP32 开发应用程序

开发任何嵌入式系统的通常方法是首先选择适合所需硬件要求的合适的微控制器或微控制器模块,同样重要的是,具有合适的软件开发支持。

开发了用于测试应用程序代码的原型硬件平台。然后,可以开始应用软件开发过程。

假设已经选择ESP32作为微控制器模块,下一步就是实际搭建一个可以开发和测试应用代码的环境。

为嵌入式系统开发应用程序是一个迭代过程,通常需要在交叉开发平台上进行设置,从而可以编写、编译、链接代码并将其加载到处理器中。

硬件测试后,重复整个过程,直到达到最终的性能要求。

整个过程通常在集成开发环境 (IDE) 中执行,该环境至少应提供以下内容: 用于编写应用程序代码的文本编辑器;编译器/链接器/定位器;加载器将编译后的二进制代码下载到目标处理器中的正确物理地址段。

IDE 通常还包括某种功能,可以自动完成整个周期。

这很复杂,需要单独安装文件编辑器和构建工具。但是,就能够编写最紧凑、最快的代码而言,它提供了最佳性能。

例如,它提供对 ESP-32 应用程序编程接口 (API) 的完全访问权限。

使用不应打折的 IDF 的替代方法是使用 Arduino。无论是使用 Arduino IDE 还是其他一些 IDE,在 Arduino 框架中开发 ESP32 应用程序几乎可以完成 ESP32 IDF 所做的一切,但学习曲线不那么陡峭。它还具有在大多数情况下可以接受的性能损失。

ESP32 Arduino 内核实际上是建立在 ESP32 IDF 之上的。它提供了一个额外的抽象层,在大多数应用程序中可以简化和加速开发。

已经有很多关于如何安装 Arduino IDE 以及如何安装任何板(例如 ESP32)的文章。还有很多库可用于帮助开发 ESP32 的各种应用程序。

本文的其余部分将重点介绍 ESP32 的一个方面,该方面通常不被大多数 Arduino 应用程序利用——ESP32 原生的 FreeRTOS

几乎所有的 Arduino 应用程序都只有一个 setup() 和一个 loop() 函数。由于 ESP32 运行 FreeRTOS,因此它具有很强的多任务处理能力。

ESP32 还是一款功能强大且速度快的微控制器,具有大量闪存和 SRAM。运行多个线程不仅非常可行,而且实际上可以简化和增强一些应用程序代码。

作为一个简单的例子,考虑一个用户希望内置 LED 在应用程序运行时持续闪烁。

下面的代码示例显示了这种尝试。不幸的是,由于代码是顺序执行的,ledBlink() 函数会占用所有处理器资源,并且运行的代码永远不会退出 setup() 函数。这意味着用户应用程序永远不会运行。

通过将 ledBlink() 函数作为定时器中断的一部分运行,可以使其正常运行。然而,在主应用程序运行时,仅仅使用一个计时器来使 LED 在后台闪烁会浪费处理器资源。现在,想象一下是否必须使多个 LED 以不同的速率闪烁。执行此操作所需的代码部分可能会变得非常复杂:

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 闪烁功能作为一项完全独立的任务实际运行。接下来的几个函数展示了如何使用 ESP32 上免费提供的 FreeRTOS API 来实现这一点。

请注意,在 setup() 函数中,创建了使 LED 闪烁的任务。在此之后,任务将永远运行,或者直到通过调用使用 FreeRTOS vTaskDekete() 函数删除任务而停止。

例如,通过这种方法,现在可以让多个 LED 以不同的速率闪烁。只需按照此处使用的相同方法创建更多任务。只需为每个 LED 选择不同的 IO 端口。

该应用程序仍将作为其自己的独立任务完全独立运行。甚至可以选择双核 ESP32 的哪个内核来运行每个任务。

例如,如果应用程序不需要无线功能(通常在 ESP32 的内核 0 上运行),那么它可用于闪烁 LED,内核 1 可专用于运行应用程序。可在此处找到 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

本文绝不是对 ESP32 的详尽描述。但您现在应该了解它的一些重要功能。

这些特性加上广泛的可用性和低成本,使 ESP32 成为需要良好支持的处理平台的嵌入式无线应用的有力竞争者。

请输入搜索关键字

确定