24小時(shí)聯(lián)系電話(huà):18217114652、13661815404
中文
- 您當前的位置:
- 首頁(yè)>
- 電子資訊>
- 技術(shù)專(zhuān)題>
- ESP32 WiFi/藍牙無(wú)線(xiàn)...
技術(shù)專(zhuān)題
ESP32 WiFi/藍牙無(wú)線(xiàn)微控制器介紹
ESP32 WiFi/藍牙無(wú)線(xiàn)微控制器介紹
ESP32 是一個(gè)非常通用的片上系統 (SoC),可用作通用微控制器,具有相當廣泛的外圍設備,包括 WiFi 和藍牙無(wú)線(xiàn)功能。
它由總部位于上海的樂(lè )鑫制造,成本不到 5 美元。雖然 ESP32 是一個(gè) SoC,但大多數用戶(hù)不會(huì )從使用 ESP32 芯片本身開(kāi)始。
圖 1 – 實(shí)際的 ESP32 SoC
雖然可以使用 ESP32 SoC 設計產(chǎn)品,但這并不是一種常見(jiàn)的方法。相反,大多數基于 ESP32 的設計使用預制模塊,這些模塊由實(shí)際的 ESP-32 SoC、外部閃存、晶體和預調諧 PCB 天線(xiàn)或 IPEX 天線(xiàn)連接器組成。
然后將整個(gè)組件放置在屏蔽罐下(圖 2)。這個(gè)模塊是樂(lè )鑫自己制作的,這個(gè)鏈接展示了幾個(gè)版本。
使用這個(gè)模塊而不是從頭開(kāi)始設計的一大優(yōu)勢是樂(lè )鑫已經(jīng)預加載了低級設備驅動(dòng)程序、WiFi b、g、n、藍牙和 BLE 的無(wú)線(xiàn)協(xié)議棧,以及作為基礎操作系統的 FreeRTOS。
此外,還加載了引導加載程序以允許相對容易地下載用戶(hù)應用程序。
圖 2 – ESP32 Wroom-32 模塊
另一個(gè)通常稱(chēng)為 ESP32 的模塊更恰當地稱(chēng)為 ESP32 開(kāi)發(fā)模塊。這基本上是一個(gè)安裝在板上的 ESP32 模塊,帶有額外的支持電路,例如穩壓器和串行轉 USB IC。
它允許直接連接到臺式 PC,然后可用于直接在該模塊上編譯、下載和運行程序。圖 3 顯示了來(lái)自不同制造商的兩個(gè)此類(lèi)開(kāi)發(fā)模塊。
請注意,一個(gè)比另一個(gè)具有更多 ESP 模塊的引腳,并且價(jià)格稍貴。否則,它們非常相似。它們都允許通過(guò) USB 電纜直接連接到桌面開(kāi)發(fā)系統。
圖 3 – ESP32 開(kāi)發(fā)模塊示例
現在您已經(jīng)了解了兩種常用的 ESP32 模塊,您應該使用哪一種?
推薦的方法是使用開(kāi)發(fā)板進(jìn)行概念驗證設計,因為它是完全獨立的。然后,當應用程序開(kāi)發(fā)得更充分,并且整個(gè)硬件設計已準備好集成時(shí),切換到更緊湊的 ESP32 模塊。
應用程序代碼可以使用適配器板下載到 ESP32 模塊(圖 4)。它本質(zhì)上提供了 ESP32 開(kāi)發(fā)模塊的所有功能。但目標是沒(méi)有實(shí)際編程接口的 ESP32 模塊,它是開(kāi)發(fā)板的一部分。
圖 4 – 用于將應用程序代碼下載到 ESP32 模塊的編程器板
主要規格和特點(diǎn):
處理器:
主處理器: Tensilica Xtensa 32位LX6微處理器
核心: 除ESP32-S0WD為單核外,ESP32系列所有版本均為雙核。
時(shí)鐘頻率: 高達 240 MHz
性能: 高達 600 DMIPS
超低功耗協(xié)處理器: 允許您在深度睡眠時(shí)進(jìn)行 ADC 轉換、計算和電平閾值。
圖 5 是該 SoC 的功能框圖,摘自其數據表,可在樂(lè )鑫網(wǎng)站上獲得。
圖 5 – 數據表中 ESP32 的功能框圖
無(wú)線(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 – 用于啟動(dòng)和核心功能
SRAM: 520 KB – 用于數據和指令
RTC 快速 SRAM: 8 KB – 用于從深度睡眠模式啟動(dòng) RTC 期間的數據存儲和主 CPU
RTC 慢速 SRAM: 8 KB – 用于深度睡眠模式期間的協(xié)處理器訪(fǎng)問(wèn)
eFuse: 1 KBit – 其中 256 位用于系統(MAC 地址和芯片配置),其余 768 位保留用于客戶(hù)應用,包括閃存加密和芯片 ID
嵌入式閃存:
0 MB(ESP32-D0WDQ6、ESP32-D0WD 和 ESP32-S0WD 芯片)
2 MB(ESP32-D2WD 芯片)
4 MB(ESP32-PICO-D4 SiP 模塊)
Flash memory 通過(guò) ESP32-D2WD 和 ESP32-PICO-D4 上的 IO16、IO17、SD_CMD、SD_CLK、SD_DATA_0 和 SD_DATA_1 內部連接。
外部閃存和 SRAM: ESP32 支持多達四個(gè) 16 MB 的外部 QSPI閃存和 SRAM,具有基于 AES 的硬件加密,以保護開(kāi)發(fā)人員的程序和數據。ESP32 可以通過(guò)高速緩存訪(fǎng)問(wèn)外部 QSPI flash 和 SRAM。
高達 16 MB 的外部閃存存儲器映射到 CPU 代碼空間,支持 8 位、16 位和 32 位訪(fǎng)問(wèn)。支持從閃存執行代碼。
多達 8 MB 的外部閃存/SRAM 存儲器映射到 CPU 數據空間,支持 8 位、16 位和 32 位訪(fǎng)問(wèn)。閃存和 SRAM 支持數據讀取。SRAM 支持數據寫(xiě)入。
請注意,ESP32 芯片內嵌 Flash 不支持外部 Flash 與外設的地址映射。
外設輸入/輸出: ESP32 提供了豐富的 DMA 外設接口,包括:
電容式觸控
ADC(模數轉換器)
DAC(數模轉換器)
I2C(內部集成電路)
UART(通用異步接收器/發(fā)送器)
CAN 2.0(控制器局域網(wǎng))
SPI(串行外設接口)
I2S(集成 Inter-IC 聲音)
RMII(簡(jiǎn)化的媒體獨立接口)
PWM(脈寬調制)等。
安全:
支持 IEEE 802.11 標準安全功能,包括 WFA、WPA/WPA2 和 WAPI
安全啟動(dòng)
閃存加密
1024位OTP,客戶(hù)最高768位
加密硬件加速:AES、SHA-2、RSA、橢圓曲線(xiàn)加密(ECC)、隨機數生成器(RNG)
為 ESP32 開(kāi)發(fā)應用程序
開(kāi)發(fā)任何嵌入式系統的通常方法是首先選擇適合所需硬件要求的合適的微控制器或微控制器模塊,同樣重要的是,具有合適的軟件開(kāi)發(fā)支持。
開(kāi)發(fā)了用于測試應用程序代碼的原型硬件平臺。然后,可以開(kāi)始應用軟件開(kāi)發(fā)過(guò)程。
假設已經(jīng)選擇ESP32作為微控制器模塊,下一步就是實(shí)際搭建一個(gè)可以開(kāi)發(fā)和測試應用代碼的環(huán)境。
為嵌入式系統開(kāi)發(fā)應用程序是一個(gè)迭代過(guò)程,通常需要在交叉開(kāi)發(fā)平臺上進(jìn)行設置,從而可以編寫(xiě)、編譯、鏈接代碼并將其加載到處理器中。
硬件測試后,重復整個(gè)過(guò)程,直到達到最終的性能要求。
整個(gè)過(guò)程通常在集成開(kāi)發(fā)環(huán)境 (IDE) 中執行,該環(huán)境至少應提供以下內容: 用于編寫(xiě)應用程序代碼的文本編輯器;編譯器/鏈接器/定位器;加載器將編譯后的二進(jìn)制代碼下載到目標處理器中的正確物理地址段。
IDE 通常還包括某種功能,可以自動(dòng)完成整個(gè)周期。
這很復雜,需要單獨安裝文件編輯器和構建工具。但是,就能夠編寫(xiě)最緊湊、最快的代碼而言,它提供了最佳性能。
例如,它提供對 ESP-32 應用程序編程接口 (API) 的完全訪(fǎng)問(wèn)權限。
使用不應打折的 IDF 的替代方法是使用 Arduino。無(wú)論是使用 Arduino IDE 還是其他一些 IDE,在 Arduino 框架中開(kāi)發(fā) ESP32 應用程序幾乎可以完成 ESP32 IDF 所做的一切,但學(xué)習曲線(xiàn)不那么陡峭。它還具有在大多數情況下可以接受的性能損失。
ESP32 Arduino 內核實(shí)際上是建立在 ESP32 IDF 之上的。它提供了一個(gè)額外的抽象層,在大多數應用程序中可以簡(jiǎn)化和加速開(kāi)發(fā)。
已經(jīng)有很多關(guān)于如何安裝 Arduino IDE 以及如何安裝任何板(例如 ESP32)的文章。還有很多庫可用于幫助開(kāi)發(fā) ESP32 的各種應用程序。
本文的其余部分將重點(diǎn)介紹 ESP32 的一個(gè)方面,該方面通常不被大多數 Arduino 應用程序利用——ESP32 原生的 FreeRTOS。
幾乎所有的 Arduino 應用程序都只有一個(gè) setup() 和一個(gè) loop() 函數。由于 ESP32 運行 FreeRTOS,因此它具有很強的多任務(wù)處理能力。
ESP32 還是一款功能強大且速度快的微控制器,具有大量閃存和 SRAM。運行多個(gè)線(xiàn)程不僅非??尚?,而且實(shí)際上可以簡(jiǎn)化和增強一些應用程序代碼。
作為一個(gè)簡(jiǎn)單的例子,考慮一個(gè)用戶(hù)希望內置 LED 在應用程序運行時(shí)持續閃爍。
下面的代碼示例顯示了這種嘗試。不幸的是,由于代碼是順序執行的,ledBlink() 函數會(huì )占用所有處理器資源,并且運行的代碼永遠不會(huì )退出 setup() 函數。這意味著(zhù)用戶(hù)應用程序永遠不會(huì )運行。
通過(guò)將 ledBlink() 函數作為定時(shí)器中斷的一部分運行,可以使其正常運行。然而,在主應用程序運行時(shí),僅僅使用一個(gè)計時(shí)器來(lái)使 LED 在后臺閃爍會(huì )浪費處理器資源?,F在,想象一下是否必須使多個(gè) LED 以不同的速率閃爍。執行此操作所需的代碼部分可能會(huì )變得非常復雜:
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 閃爍功能作為一項完全獨立的任務(wù)實(shí)際運行。接下來(lái)的幾個(gè)函數展示了如何使用 ESP32 上免費提供的 FreeRTOS API 來(lái)實(shí)現這一點(diǎn)。
請注意,在 setup() 函數中,創(chuàng )建了使 LED 閃爍的任務(wù)。在此之后,任務(wù)將永遠運行,或者直到通過(guò)調用使用 FreeRTOS vTaskDekete() 函數刪除任務(wù)而停止。
例如,通過(guò)這種方法,現在可以讓多個(gè) LED 以不同的速率閃爍。只需按照此處使用的相同方法創(chuàng )建更多任務(wù)。只需為每個(gè) LED 選擇不同的 IO 端口。
該應用程序仍將作為其自己的獨立任務(wù)完全獨立運行。甚至可以選擇雙核 ESP32 的哪個(gè)內核來(lái)運行每個(gè)任務(wù)。
例如,如果應用程序不需要無(wú)線(xiàn)功能(通常在 ESP32 的內核 0 上運行),那么它可用于閃爍 LED,內核 1 可專(zhuān)用于運行應用程序??稍诖颂幷业?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 成為需要良好支持的處理平臺的嵌入式無(wú)線(xiàn)應用的有力競爭者。