トップ画像
フリーズしたときにマイコンを自動で再起動する

執筆者: 瀕死

最終更新: 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を参照のこと。

初期化

  1. CTRLレジスタのENABLEを0に設定する。
  2. カウントが0に達した場合にリセットするシステムをPSMのWDSELレジスタで指定する。
  3. 値を書き込む。
  4. CTRLレジスタのENABLEを1に設定する。

値の書き込み

LOADレジスタの0:23ビット目に書き込むだけでよい。 単位はマイクロ秒で2倍にすること。

その他

CTRLレジスタのTIMEを読み込むと、現在のカウントが確認できる。

参考文献

取得に失敗しました

2024年度 入部