ラズパイ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シリアルポートに接続しました。


コメント