執筆者: 瀕死
最終更新: 2024/08/06
本稿では、RP2040開発ボードにおいて、フリーズしたときに自動で再起動させる手法について解説する。
ウォッチドッグタイマーを利用することで、このような再起動を実現できる。
RP2040においてはカウントダウンタイマーであり、ゼロに達すると再起動が発生する。 カウントががゼロに達しないように、定期的に値を書き込むようにソフトウェアを設計しておく。 そうすることで、何かしらでフリーズすると値が書き込まれなくなるため、自動で再起動が行われる。
RP2040 C/C++SDKを用いる場合は以下のような関数を用いる。
まず、ウォッチドッグタイマーを有効化する必要がある。
void watchdog_enable(uint32_t delay_ms, bool pause_on_debug)
delay_ms
: カウンタがオーバーフローするまでの時間pause_on_debug
: デバッグ実行の際に、再起動ではなく一時停止するウォッチドッグタイマーをリセットするのは以下の関数である。
void watchdog_update(void);
今回はコード例が紹介できないので、代わりにすこし低レベルな仕様について確認する。
ウォッチドッグタイマーのレジスタはメモリマップドI/Oによってアクセスでき、0x40058000
から始まる。
重要なレジスタはCTRLとLOADである。ほかにもレジスタがいくつかあるが省略した。
Offset | Name |
---|---|
0x00 | CTRL |
0x04 | LOAD |
CTRLレジスタの内訳は以下のようになっている。
Bits | Name | Type | Reset |
---|---|---|---|
31 | TRIGGER | SC | 0x0 |
30 | ENABLE | RW | 0x0 |
29:27 | Reserved | - | - |
26 | PAUSE_DBG1 | RW | 0x1 |
25 | PAUSE_DBG0 | RW | 0x1 |
24 | PAUSE_JTAG | RW | 0x1 |
23:0 | TIME | RO | 0x000000 |
LOADレジスタの内訳は以下のようになっている。
Bits | Type | Reset |
---|---|---|
31:24 | - | - |
23:0 | RW | 0x0 |
詳細はRP2040データシート 4.7. Watchdogを参照のこと。
ENABLE
を0に設定する。ENABLE
を1に設定する。LOADレジスタの0:23ビット目に書き込むだけでよい。 単位はマイクロ秒で2倍にすること。
CTRLレジスタのTIME
を読み込むと、現在のカウントが確認できる。
この人が書いた記事