ESP32のチップ情報(チップのリビジョン、CPUの動作周波数、フラッシュメモリのサイズ、MACアドレスなど)を取得する方法について説明します。チップ情報は、ESP-IDFライブラリを使用するか、ESP32のArduinoライブラリを使用して取得します。
Miscellaneous System APIs
ESP-IDFライブラリを使用する場合は、以下のWebページで説明されているAPIを使用します。
主なAPI
機能 | 関数 | プロトタイプ宣言 |
---|---|---|
Software Reset | esp_restart() | void esp_restart(void) |
Reset Reason | esp_reset_reason() | esp_reset_reason_t esp_reset_reason(void) |
Heap Memory | esp_get_free_heap_size() esp_get_minimum_free_heap_size() | uint32_t esp_get_free_heap_size(void) |
MAC address(factory-programmed) | esp_efuse_mac_get_default() | esp_err_t esp_efuse_mac_get_default(uint8_t *mac) |
MAC Address | esp_read_mac() | esp_err_t esp_read_mac(uint8_t *mac, esp_mac_type_t type) |
Chip Version | esp_chip_info() esp_chip_info_t | void esp_chip_info(esp_chip_info_t *out_info) |
SDK Version | esp_get_idf_version() | const char *esp_get_idf_version(void) |
Reset Reason
esp_reset_reason関数を使用すると、リセットの要因をチェックすることができます。
#include "esp_system.h"
void GetResetReason(void)
{
esp_reset_reason_t reason = esp_reset_reason();
String wstr = "リセット理由: ";
switch(reason)
{
case ESP_RST_UNKNOWN:
wstr += " Reset reason can not be determined";
break;
case ESP_RST_POWERON:
wstr += "Reset due to power-on event";
break;
case ESP_RST_EXT:
wstr += "Reset by external pin (not applicable for ESP32)";
break;
case ESP_RST_SW:
wstr += "Software reset via esp_restart";
break;
case ESP_RST_PANIC:
wstr += "Software reset due to exception/panic";
break;
case ESP_RST_INT_WDT:
wstr += "Reset (software or hardware) due to interrupt watchdog";
break;
case ESP_RST_TASK_WDT:
wstr += "Reset due to task watchdog";
break;
case ESP_RST_WDT:
wstr += "Reset due to other watchdogs";
break;
case ESP_RST_DEEPSLEEP:
wstr += "Reset after exiting deep sleep mode";
break;
case ESP_RST_BROWNOUT:
wstr += "Brownout reset (software or hardware)";
break;
case ESP_RST_SDIO:
wstr += "Reset over SDIO";
break;
default:
wstr += "???";
break;
}
M5.Lcd.println(wstr);
}
構造体esp_reset_reason_tは、esp_system.h内で、以下のように定義されています。
typedef enum {
ESP_RST_UNKNOWN, //!< Reset reason can not be determined
ESP_RST_POWERON, //!< Reset due to power-on event
ESP_RST_EXT, //!< Reset by external pin (not applicable for ESP32)
ESP_RST_SW, //!< Software reset via esp_restart
ESP_RST_PANIC, //!< Software reset due to exception/panic
ESP_RST_INT_WDT, //!< Reset (software or hardware) due to interrupt watchdog
ESP_RST_TASK_WDT, //!< Reset due to task watchdog
ESP_RST_WDT, //!< Reset due to other watchdogs
ESP_RST_DEEPSLEEP, //!< Reset after exiting deep sleep mode
ESP_RST_BROWNOUT, //!< Brownout reset (software or hardware)
ESP_RST_SDIO, //!< Reset over SDIO
} esp_reset_reason_t;
esp_get_free_heap_size
esp_get_free_heap_size関数は、ESP32の空きヒープサイズを取得します。メモリリークの検出やメモリ不足の回避に役立ちます。
#include "esp_system.h"
void GetHeapMemory(void)
{
//利用可能なヒープのサイズを取得
M5.Lcd.printf("Available Heap Size= %d\r\n", esp_get_free_heap_size());
//利用可能な内部ヒープのサイズを取得
M5.Lcd.printf("Available Internal Heap Size = %d\r\n", esp_get_free_internal_heap_size());
//これまでに利用可能だった最小ヒープを取得します
M5.Lcd.printf("Minimum Free Heap Ever Available Size = %d\r\n", esp_get_minimum_free_heap_size());
M5.Lcd.println();
}
MACアドレスの取得
esp_efuse_mac_get_default関数、esp_read_mac関数を使用してMACアドレスを取得できます。ネットワーク通信や個体識別に必要となることがあります。
#include "esp_system.h"
void CheckMACAddress(void)
{
uint8_t mac0[6];
esp_efuse_mac_get_default(mac0);
M5.Lcd.printf("Default Mac Address\n %02X:%02X:%02X:%02X:%02X:%02X\r\n",
mac0[0], mac0[1], mac0[2], mac0[3], mac0[4], mac0[5]);
uint8_t mac3[6];
esp_read_mac(mac3, ESP_MAC_WIFI_STA);
M5.Lcd.printf("[Wi-Fi Station] Mac Address\n %02X:%02X:%02X:%02X:%02X:%02X\r\n",
mac3[0], mac3[1], mac3[2], mac3[3], mac3[4], mac3[5]);
uint8_t mac4[7];
esp_read_mac(mac4, ESP_MAC_WIFI_SOFTAP);
M5.Lcd.printf("[Wi-Fi SoftAP] Mac Address\n %02X:%02X:%02X:%02X:%02X:%02X\r\n",
mac4[0], mac4[1], mac4[2], mac4[3], mac4[4], mac4[5]);
uint8_t mac5[6];
esp_read_mac(mac5, ESP_MAC_BT);
M5.Lcd.printf("[Bluetooth] Mac Address\n %02X:%02X:%02X:%02X:%02X:%02X\r\n",
mac5[0], mac5[1], mac5[2], mac5[3], mac5[4], mac5[5]);
uint8_t mac6[6];
esp_read_mac(mac6, ESP_MAC_ETH);
M5.Lcd.printf("[Ethernet] Mac Address\n %02X:%02X:%02X:%02X:%02X:%02X\r\n",
mac6[0], mac6[1], mac6[2], mac6[3], mac6[4], mac6[5]);
}
M5Stack(ESP32)は、以下の4つのMACアドレスを持っています。
Interface | MAC Address (4 universally administered, default) | MAC Address (2 universally administered) |
---|---|---|
Wi-Fi Station | base_mac | base_mac |
Wi-Fi SoftAP | base_mac, +1 to the last octet | Local MAC (derived from Wi-Fi Station MAC) |
Bluetooth | base_mac, +2 to the last octet | base_mac, +1 to the last octet |
Ethernet | base_mac, +3 to the last octet | Local MAC (derived from Bluetooth MAC) |
esp_chip_info関数
esp_chip_info関数 及び esp_chip_info_t
構造体を使ってチップのコア数、WiFi機能、リビジョン、フラッシュサイズなどの情報を取得できます。
#include <Arduino.h>
#include <M5Unified.h>
#include "esp_chip_info.h"
#include "esp_system.h"
void GetChipInfo(void)
{
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
M5.Lcd.printf("このチップはESP32ファミリーです\n");
M5.Lcd.printf("このチップはESP32ファミリーです\n");
M5.Lcd.printf("コアの数: %d\n", chip_info.cores);
M5.Lcd.printf("WiFi%s%s%s\n",
(chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi " : "",
(chip_info.features & CHIP_FEATURE_BT) ? "BT " : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "BLE " : "");
M5.Lcd.printf("リビジョン番号: %d\n", chip_info.revision);
M5.Lcd.printf("フラッシュ容量: %dMB\n", spi_flash_get_chip_size() / (1024 * 1024));
}
void setup()
{
auto cfg = M5.config(); // 設定用の構造体を取得。
M5.begin(cfg); // M5Unifiedを使用する準備をする。
M5.Lcd.setFont(&fonts::lgfxJapanMinchoP_16);
GetChipInfo();
}
void loop()
{
M5.delay(1);
}
- esp_chip_info_t構造体: チップの情報を格納する構造体です。
- esp_chip_info関数: チップ情報を「esp_chip_info_t」構造体に取得します。
- spi_flash_get_chip_size関数: フラッシュメモリのサイズを取得します。
esp_get_idf_version関数
ESP-IDFのバージョンを取得します。 使用しているESP-IDFのバージョンを確認できます。
#include "esp_system.h"
void GetESPIDFVersion(void)
{
M5.Lcd.print("ESP-IDF Version: ");
M5.Lcd.println(esp_get_idf_version());
}
EspClassクラス
ESP32のArduinoライブラリを使
#include <Arduino.h>
#include <M5Unified.h>
void GetChipInfo2(void)
{
M5.Lcd.printf("チップモデル: %s\n", ESP.getChipModel());
M5.Lcd.printf("コア数: %d\n", ESP.getChipCores());
M5.Lcd.printf("リビジョン: %d\n", ESP.getChipRevision());
M5.Lcd.printf("フラッシュメモリサイズ: %dMB\n", ESP.getFlashChipSize() / (1024 * 1024));
}
void setup()
{
auto cfg = M5.config(); // 設定用の構造体を取得。
M5.begin(cfg); // M5Unifiedを使用する準備をする。
M5.Lcd.setFont(&fonts::lgfxJapanMinchoP_16);
GetChipInfo2();
}
void loop()
{
M5.delay(1);
}
EspClassクラス
ESP32の情報は、EspClassクラスを使用して取得できます。のソースファイルは、Esp.cpp、Esp.h となります。
EspClassクラスのオブジェクトとして、ESPが使用できます。Esp.cpp内で、以下のように宣言されています。
EspClass ESP;
システム情報の取得
メソッド | 説明 |
---|---|
ESP.getChipModel() | チップのモデルを取得 |
ESP.getChipCores() | コア数を取得 |
ESP.getChipRevision() | チップのリビジョンを取得 |
ESP.getFlashChipSize() | フラッシュメモリのサイズを取得 |
ESP.getSdkVersion() | SDKバージョンを取得 |
ESP.getCpuFreqMHz() | CPUのクロック周波数を取得 |
void GetChipInfo()
{
M5.Lcd.printf("チップモデル: %s\n", ESP.getChipModel());
M5.Lcd.printf("コア数: %d\n", ESP.getChipCores());
M5.Lcd.printf("リビジョン: %d\n", ESP.getChipRevision());
M5.Lcd.printf("フラッシュメモリ: %dMB\n", ESP.getFlashChipSize() / (1024 * 1024));
M5.Lcd.printf("SDKバージョン: %s\n", ESP.getSdkVersion());
M5.Lcd.printf("CPU周波数: %d MHz\n", ESP.getCpuFreqMHz());
}
メモリ情報の取得
メソッド | 説明 |
---|---|
ESP.getFreeHeap() | 空きヒープメモリを取得 |
ESP.getHeapSize() | 全体のヒープメモリサイズを取得 |
ESP.getPsramSize() | PSRAM(拡張RAM)のサイズを取得 |
ESP.getFreePsram() | 空きPSRAMサイズを取得 |
void GetHeapMemory2()
{
M5.Lcd.printf("空きヒープメモリ: %d バイト\n", ESP.getFreeHeap());
M5.Lcd.printf("ヒープサイズ: %d バイト\n", ESP.getHeapSize());
M5.Lcd.printf("PSRAMサイズ: %d バイト\n", ESP.getPsramSize());
M5.Lcd.printf("空きPSRAM: %d バイト\n", ESP.getFreePsram());
}
PSRAMがない場合は 0
が返ります。
リセット・電源管理
メソッド | 説明 |
---|---|
ESP.restart() | ソフトウェアリセット |
ESP.reset() | ハードリセット(ESP.restart()推奨) |
ESP.deepSleep(microseconds) | ディープスリープ |
ESP.restart(); // ソフトウェアリセット
MACアドレスの取得
メソッド | 説明 |
---|---|
ESP.getEfuseMac() | eFuse に格納されているMACアドレスを取得 |
void GetMACAddress()
{
M5.Lcd.printf("eFuse MACアドレス:\n %llX\n", ESP.getEfuseMac());
}
ESP32のChipID(チップID)
ESP32のChipID(チップID)の計算方法は幾通りかあるようです。基本的には、ユニークなMACアドレスを利用して計算します。
MACアドレスの下位2バイトを使用
MACアドレスの下位2バイトを使用する方法。
// 上位4バイト(32ビット)を使用
uint64_t ESP32_MacAddress0 = ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes).
uint16_t ESP32_ChipId = (uint16_t)(ESP32_MacAddress0 >> 32);
M5.Lcd.printf("ESP32_ChipId : (%04X)\n", ESP32_ChipId);
// 上位4バイト(32ビット)を使用
uint32_t chipId;
uint64_t mac = ESP.getEfuseMac(); // 64ビットのMACアドレス取得
chipId = (uint32_t)(mac >> 32); // 上位4バイト(32ビット)を使用
M5.Lcd.printf("Chip ID: %08X\n", chipId);
MACアドレスの上位3 or 4バイトを使用
MACアドレスの下位3 or 4バイトを使用する方法。
ESP32のArduinoのサンプルに、チップIDwo計算するサンプルコード「GetChipID.ino」があります。
// framework-arduinoespressif32/libraries/ESP32/examples/ChipID/GetChipID/GetChipID.ino
// GetChipID.ino
uint32_t chipId = 0;
for(int i=0; i<17; i=i+8)
{
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
}
M5.Lcd.printf("Chip ID: %d(%x)\n", chipId, chipId);
// -----------------------------------------
// 上位3バイトを使用
uint8_t mac[6];
esp_efuse_mac_get_default(mac);
uint32_t old_chip_id = mac[3] << 16 | mac[4] << 8 | mac[5];
M5.Lcd.printf("Old Chip ID: %06X\n", old_chip_id);
MACアドレスの下位 4バイトを使用した計算方法です。
uint8_t mac[6];
esp_efuse_mac_get_default(mac);
// 上位4バイトを使用
uint32_t new_chip_id = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
M5.Lcd.printf("New Chip ID: %08X\n", new_chip_id);
