ラズパイpicoでWDT by ArduinoIDE

プログラミング

 ラズパイpicoにはWDTが内蔵されているらしいことを知り、使い方をググってみると、python等での使用例はありましたが、Arduino IDEでの例が見つかりませんでした。しかし、RP2040 Helper Classというクラスライブラリには、ラズパイ内蔵のハードウェアをサポートする様々な関数が用意されています。Hardware Watchdogという項目の説明に void rp2040.wdt_begin(uint32_t delay_ms)や void rp2040.wdt_reset() という関数があるので、テストプログラムを書いて試してみました。以下にソースコードを示します。

// WDT example by Hidef NAMVA

int incomingByte = 0; 

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.begin(115200);
  while (!Serial); // debug only, comment out when real use
  Serial.println("program has started");
  int freq = rp2040.f_cpu();
  Serial.print("CPU clock = ");
  Serial.println(freq);

  rp2040.wdt_begin(10000); //set timeout to 10sec
  Serial.println("WDT started, you need to send some char(s) from console within 10 sec");
  digitalWrite(LED_BUILTIN, HIGH);
 }

void loop() {
 
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();
    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
    rp2040.wdt_reset();
  }
}

 前述のプログラムでは、動作周波数を読み出す関数も使ってみました。リセット後に、シリアルポートから何らかの入力があれば、wdt_reset関数を呼んでWDTを刺激しています。10秒でタイムアウトするように記述しているので、10秒以上シリアルポートからデータを受信しなければ、WDTによりCPUがハードウェアリセットされます。このテストをする時、ArduinoIDEのシリアルモニタを使うとリセット後にUSBシリアルが期待通り動作しないので、TeraTermを使ってUSBシリアルポートに接続しました。

コメント