ESP32-S3モジュールは相当魅力的ですが、情報量が少ないので、少しづつ自分なりに確認していきます。開発環境はVScode+PlatformIO ESP-IDF版です。
今回は、秋月販売のモジュールESP32-S3-1-N16R8を使う確認です。販売されているESP32-S3-DevkitC-1とはモジュールの種類が違うので乗せ換えて動かしてみます。
N16R8を使いたい。
高性能マイコンとして使ってみたいだけなので、ESP32-S3-DevkitCで動作確認して、N16R8でも同じに動作させたいのです。
ESP32-S3-DevkitCはD3N8、モジュール品はN16R8、PSRAMでGPIO33~37使う。
DevkitC搭載のS3の彫刻は「D3N8」ですが、データシートにD3N8という型番はないのでおそらく「ESP32-S3-WROOM-1-N8」と推測します。HPに「N8」と書いてありました(^^)。
N8とN16R8との(私が)気になる違いは、PSRAMがQuad→OctalSPIです。接続ピンが増えるらしくデータシートによるとGPIO33~37はPSRAM用となりGPIOとしての使用は非推奨となっています。いま検討している事案では、このポートが汎用で使用可否が懸案事項なのです。まずはデフォルト状態でGPIO33~37使えるかどうか確認です。
DevkitCにN16R8を載せかえる
DevkitCとしてブレッドボードで確認したいので乗せ換えます。
外したN8デバイスには25Q64ES1Gが使われていた。
外してみたら8ピンQuad64MbitSPIFlashが搭載されてましたがSPIは一組です。N16R8ではこれがOctalになるそうで、SPI組が増えてGPIO33~37にOctalSPI信号が割り当てられると想像つきます。N16R8を分解して接続を見る必要ありますが、PSRAMを使用しない設定にできればそのままでIOポートとして使えると推定します。まずはデフォルトでなにも設定しないでポートとしてアクセスしてみます。
PlatformIOで確認。とりあえずGPIO36,37は汎用IOで使えた。
確認プログラム抜粋です(PlatformIOのBlink Exampleを流用)
#define BLINK_GPIO (gpio_num_t)45
#define SW6 (gpio_num_t)37
・
・
static void blink_led(int s_led_state) {
gpio_set_level(BLINK_GPIO, s_led_state);
}
・
・
static void configure_led(void)
{
gpio_reset_pin(BLINK_GPIO);
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}
void ledTestTask(void *pvParameters) {
for(;;) {
if(gpio_get_level(SW6)==0) s_led_state=1; else s_led_state=0;
blink_led(s_led_state);
vTaskDelay(50);
}
}
extern "C" void app_main() {
gpio_reset_pin(SW6); gpio_set_direction(SW6, GPIO_MODE_INPUT);
gpio_set_pull_mode(SW6,GPIO_PULLUP_ONLY);
configure_led();
xTaskCreate(ledTestTask,"ledtest", 2048, NULL, 5, NULL);
while (1) {
vTaskDelay(100);
}
}
というわけで、とりあえずデフォルトでGPIO36をLED出力、GPIO37をスイッチ入力としてみたところ、無事に動作しました。めでたしめでたし。信号波形もきれいで衝突・干渉等はありません。
PSRAMを使わない・・という設定をきちんと確認する必要はあると思います。
sdkconfigに「PSRAM」のキーワードがなかったので、そう簡単には見つかりませんが、これから関連項目を探すことにします。
次はJTAG用USBを使った汎用CDCの確認です
これができれば、単なる高性能マイコンボードとして使える用途が増えそうです。