24小時聯系電話:18217114652、13661815404
中文
技術專題
ESP32 WiFi/藍牙無線微控制器介紹
ESP32 WiFi/藍牙無線微控制器介紹
ESP32 是一個非常通用的片上系統 (SoC),可用作通用微控制器,具有相當廣泛的外圍設備,包括 WiFi 和藍牙無線功能。
它由總部位于上海的樂鑫制造,成本不到 5 美元。雖然 ESP32 是一個 SoC,但大多數用戶不會從使用 ESP32 芯片本身開始。
圖 1 – 實際的 ESP32 SoC
雖然可以使用 ESP32 SoC 設計產品,但這并不是一種常見的方法。相反,大多數基于 ESP32 的設計使用預制模塊,這些模塊由實際的 ESP-32 SoC、外部閃存、晶體和預調諧 PCB 天線或 IPEX 天線連接器組成。
然后將整個組件放置在屏蔽罐下(圖 2)。這個模塊是樂鑫自己制作的,這個鏈接展示了幾個版本。
使用這個模塊而不是從頭開始設計的一大優勢是樂鑫已經預加載了低級設備驅動程序、WiFi b、g、n、藍牙和 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 32位LX6微處理器
核心: 除ESP32-S0WD為單核外,ESP32系列所有版本均為雙核。
時鐘頻率: 高達 240 MHz
性能: 高達 600 DMIPS
超低功耗協處理器: 允許您在深度睡眠時進行 ADC 轉換、計算和電平閾值。
圖 5 是該 SoC 的功能框圖,摘自其數據表,可在樂鑫網站上獲得。
圖 5 – 數據表中 ESP32 的功能框圖
無線連接:
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 – 用于啟動和核心功能
SRAM: 520 KB – 用于數據和指令
RTC 快速 SRAM: 8 KB – 用于從深度睡眠模式啟動 RTC 期間的數據存儲和主 CPU
RTC 慢速 SRAM: 8 KB – 用于深度睡眠模式期間的協處理器訪問
eFuse: 1 KBit – 其中 256 位用于系統(MAC 地址和芯片配置),其余 768 位保留用于客戶應用,包括閃存加密和芯片 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 支持多達四個 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(數模轉換器)
I2C(內部集成電路)
UART(通用異步接收器/發送器)
CAN 2.0(控制器局域網)
SPI(串行外設接口)
I2S(集成 Inter-IC 聲音)
RMII(簡化的媒體獨立接口)
PWM(脈寬調制)等。
安全:
支持 IEEE 802.11 標準安全功能,包括 WFA、WPA/WPA2 和 WAPI
安全啟動
閃存加密
1024位OTP,客戶最高768位
加密硬件加速:AES、SHA-2、RSA、橢圓曲線加密(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 在后臺閃爍會浪費處理器資源?,F在,想象一下是否必須使多個 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 可專用于運行應用程序??稍诖颂幷业?span> 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 成為需要良好支持的處理平臺的嵌入式無線應用的有力競爭者。