IO12
IO12ピンは、フラッシュチップへの供給電圧(VDD_SDIO)を決めるのに使われていて、LOWなら電圧が3.3V、HIGHなら電圧が1.8Vに決まります。どこにもつながっていないときは、プルダウン抵抗でLOWに落とされ、ESP32に3.3Vが供給されます。しかし、IO12が何処かにつながって、HIGHになっているときは、電源電圧が1.8Vとなるため、フラッシュチップが起動せず書き込みができない状態となるようです。今回実行したコマンド.\espefuse --port COM10 set_flash_voltage 3.3V
で、IO12の状態に関わらず、フラッシュチップへの供給電源電圧3.3Vに設定すると、無事電源が供給されて書き込めるようになる、ということでした。
SD Card
サンプルのSD_TestはESP32用。ArduinoIDE 2.3.2
ESP32-DevKitC | microSD モジュール |
---|
3.3V | 3V3 |
GPIO5(SPI SS) | CS |
GPIO23(SPI MOSI) | MOSI |
GPIO18(SPI SCK) | CLK |
GPIO19(SPI MISO) | MISO |
GND | GND |
IO2 の設定基本オープン、もしくはpull-downしておく。pull-upの場合はダウンロード時エラー。
Sketch uses 262541 bytes (20%) of program storage space. Maximum is 1310720 bytes.
Global variables use 21344 bytes (6%) of dynamic memory, leaving 306336 bytes for local variables. Maximum is 327680 bytes.
esptool.py v4.5.1
Serial port /dev/cu.usbserial-14130
Connecting......................................
A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0xb)! The chip needs to be in download mode.
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html
Failed uploading: uploading error: exit status 2
割り込みのテスト
/************************************************
* ESP32 interrupt minimum test
* Wemos D1 mini ESP32 v1.0
* 2024/3/27
* *********************************************/
#define LED_PIN 2
// 1. タイマー宣言
hw_timer_t * timer = NULL;
hw_timer_t * timer1 = NULL;
volatile int interruptCounter = 0;
int totalInterruptCounter = 0;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
// 6. タイマー呼び出しされるコールバック関数
void IRAM_ATTR onTimer() {
portENTER_CRITICAL_ISR(&timerMux);
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
portEXIT_CRITICAL_ISR(&timerMux);
}
// タイマー1呼び出しされるコールバック関数
void IRAM_ATTR onTimer1() {
portENTER_CRITICAL_ISR(&timerMux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&timerMux);
}
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
// 2. タイマー作成。0番のタイマーを80クロックで1カウント、カウントアップ
timer = timerBegin(0, 80, true);
// 3. 割り込みの設定。第一引数は設定するタイマー、第二引数は割り込み関数
timerAttachInterrupt(timer, &onTimer, true);
// 4. トリガー条件を設定。timerが1000,000カウントごとに割り込みを発生させる
timerAlarmWrite(timer, 1000000, true);
// 5. タイマーを有効化
timerAlarmEnable(timer);
// 2. タイマー(1)
timer1 = timerBegin(1, 80, true);
timerAttachInterrupt(timer1, &onTimer1, true);
timerAlarmWrite(timer1, 3000000, true);
// 5. タイマーを有効化
timerAlarmEnable(timer1);
}
void loop() {
if (interruptCounter > 0) {
portENTER_CRITICAL(&timerMux);
interruptCounter--;
portEXIT_CRITICAL(&timerMux);
totalInterruptCounter++;
Serial.print("An interrupt as occurred. Total number: ");
Serial.println(totalInterruptCounter);
}
}
EEPROM
ESP-WROOM-32 のEEPROM(疑似)のサイズ1K(1024)
struct DATA_SET{
int vala;
int valb;
char check[10];
};
DATA_SET data;
//データをEEPROMから読み込む。保存データが無い場合デフォルトにする。
void load_data() {
EEPROM.get<DATA_SET>(0, data);
if (strcmp(data.check, DATA_VERSION)) { //バージョンをチェック
//保存データが無い場合デフォルトを設定
data.vala = DEFAULT_VALA;
data.valb = DEFAULT_VALB;
}
}
//EEPROMへの保存
void save_data() {
//EEPROMに設定を保存する。
strcpy(data.check, DATA_VERSION);
EEPROM.put<DATA_SET>(0, data);
EEPROM.commit(); //大事
}
変数のサイズ
uint8_t 1
uint16_t 2
int 2
ulong 4
float 4
自作ESP-Progだと電源が不安定。FlexyPinのアダプターが問題?
コメント