外部クロック32kHz(RTC用)を使う

更新日: 2026.04.20

概要

内蔵のRC発振器でも十分なんですが、ちょっと欲を出してRTC用外付け発振器を使って見ました。 今回はこれを使ってみました。 【10個入】クリスタル 32.768kHz(水晶発振子)

32khz RTC Crystal

回路

ESP32を使って下記の様に配線しました。

32khz RTC Crystal
  • 必要部品
    部品詳細個数
    抵抗5MΩ1個
    発振器32KHz(RTC用)1個
    コンデンサ12pF2個
  • ESP32 の GPIO32,33 に配線します。(これらのピンは固定です。変更出来ません)

サンプルスケッチ

sample.ino arduino
#include "Arduino.h" #include "soc/rtc.h" void setup() { Serial.begin(115200); delay(1000); Serial.println("\n--- External Crystal (32.768kHz) Test ---"); // 以前のRC発振器から切り替えます rtc_clk_32k_enable(true); Serial.println("Waiting for crystal to stabilize..."); // 水晶が安定するまで1秒待つ。安定しない場合は配線やコンデンサに問題がある可能性があります bool crystal_ok = false; for (int i = 0; i < 10; i++) { if (rtc_clk_32k_enabled()) { crystal_ok = true; break; } delay(100); Serial.print("."); } if (crystal_ok) { Serial.println("\n[SUCCESS] External 32kHz Crystal is working!"); // 内部回路が「安定した」と判断するまでのチェック rtc_clk_32k_bootstrap(5); // RTCのソースを外部クリスタルに固定 rtc_clk_slow_freq_set(RTC_SLOW_FREQ_32K_XTAL); } else { Serial.println("\n[ERROR] External Crystal NOT detected. Check wiring on GPIO 32/33."); } } void loop() { // 動作中、1秒ごとに現在の時刻(RTCカウント)を表示 // 外部クリスタルが正確なら、このカウントも正確になります unsigned long now_ms = millis(); Serial.printf("System running... Time: %lu ms\n", now_ms); delay(1000); }
  • 外部発振器に切り替え、1秒に1回時間を表示するスケッチ
  • rtc_clk_32k_enable(true); 外部発振器の管理
    • 引数
      • true: 発信開始
      • false: 発信停止
      • 無し: 発信の状態を返す。 true: OK / false: NG
  • rtc_clk_32k_bootstrap(5); 再確認
    • 引数
      • 確認の回数。5回が推奨値。
  • rtc_clk_slow_freq_set(RTC_SLOW_FREQ_32K_XTAL); ここで発振器を切り替える。
    • 引数
      • RTC_SLOW_FREQ_RTC: 内蔵RC発振器
      • RTC_SLOW_FREQ_32K_XTAL: 外部水晶発振子
      • RTC_SLOW_FREQ_8MD256: 内蔵8MHzを256分周したもの

実行結果

コンパイルし実行すると下記の様に問題無く動きました。

115200 baud ets Jul 29 2019 12:21:46 rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0030,len:4980 load:0x40078000,len:16612 load:0x40080400,len:3480 entry 0x400805b4 --- External Crystal (32.768kHz) Test --- Waiting for crystal to stabilize... [SUCCESS] External 32kHz Crystal is working! System running... Time: 1026 ms System running... Time: 2037 ms System running... Time: 3037 ms System running... Time: 4037 ms System running... Time: 5037 ms System running... Time: 6037 ms System running... Time: 7037 ms System running... Time: 8037 ms System running... Time: 9037 ms

注意

この外部発振器、ESP32の revision が v3.xx 以上で無いと発信が安定しない様です。注意して下さい。 revision はコンパイル後の出力画面に下記の様に表示されます。

最大1310720バイトのフラッシュメモリのうち、スケッチが1029175バイト(78%)を使っています。 最大327680バイトのRAMのうち、グローバル変数が48284バイト(14%)を使っていて、ローカル変数で279396バイト使うことができます。 esptool v5.1.0 Serial port /dev/ttyUSB0: Connecting.... Connected to ESP32 on /dev/ttyUSB0: Chip type: ESP32-D0WD-V3 (revision v3.1) Features: Wi-Fi, BT, Dual Core + LP Core, 240MHz, Vref calibration in eFuse, Coding Scheme None Crystal frequency: 40MHz MAC: 88:13:bf:04:03:70

最後に

外付けのRTC(I2C等で繋ぐやつ)を使う方法も有りますが、こちらの方が値段的に安価になると思います。 ESPの revision に気を付けて使えば簡単に動きます。

SINCE 2026