ラズピコ ウォッチドッグタイマーを使ってみる

  • 2023.02.03
  • WDT
ラズピコ ウォッチドッグタイマーを使ってみる

皆さん こんにちは。

今回は ウォッチドッグタイマーを使ってみます。

ウォッチドッグタイマーとは

番犬タイマーと呼べば良いでしょうか。
カウンターを監視していて、オーバーフローするとマイコンにリセットがかかるというものです。
例えばプログラムが暴走して動かなくなった場合にリセットをかけて正常に動作させる役割を持ちます。
通常はリセットがかからないようにカウンターをリフレッシュしてあげます。

ひと昔前までは、電源電圧の低下を監視する機能なども含んだ専用のICが主流でしたが今ではマイコンに内蔵しているものが多くなっています。

ここでは WDT と略して呼ぶことにします。

プロジェクトの作成

以下の設定でプロジェクトを作成します。

Project Name: picoWdt

Library Options の HW watchdog をチェックする
Console Options の Console over UART をチェックする
IDE Options の Create VSCode project をチェックする
Debugger: は PicoProbe を選択する

VSCodeを起動する

起動後、何かファイルが開いてたら File – Close Folder で閉じた後、File – Open Folder から picoWdt のフォルダーを辿って選択します。

こちらの環境では C:\Users\m3925\Documents\Pico\pico-project-generator\picoWdt です。

m3925の部分は皆さんのユーザー名に置き換えてください。

vscode関連の json ファイルは前回作成済のプロジェクトのものをドラッグ&ドロップでコピー&ペーストすると楽です。

ソースコードを書く

picoWdt.c を以下の通りに編集します。

#include <stdio.h>
#include "hardware/watchdog.h"
#include "pico/stdlib.h"

int main() {
    stdio_init_all();

    if (watchdog_caused_reboot()) {
        printf("Rebooted by Watchdog!\n");
    } else {
        printf("Clean boot\n");
    }

    watchdog_enable(5000, 1);

    for (uint i = 0; i < 5; i++) {
        printf("Updating watchdog %d\n", i);
        watchdog_update();
    }

    printf("Waiting to be rebooted by watchdog\n");
    while (true) {
        ;
    }
    return 0;
}

PC側の準備

WDTの動作確認用として Tera Term を使います。
API関数がうまく動作したか否かなどの結果をUARTのputs()やprintf()でログ出力するようにしてみました。

Tera Termをお持ちでない方は こちら からダウンロードしてお使いください。

インストール後、 Tera Term を起動し、シリアルポートでPicoprobeのCOMポートを選択します。

もしCOMポートが複数ある場合には、Picoprobe以外の通信ケーブルをはずしてデバイスマネージャーでCOMポート番号を確認しておきます。

起動後、設定メニューのシリアルポートから以下の設定を行います。

スピート : 115200
データ : 8 bit
パリティ : なし
ストップビット : 1
フロー制御 : none

(設定値からスピードだけ変更すれば良いはずです)

今回使ったWDTのAPI

watchdog_caused_reboot()

WDTが原因による再起動か調べる
戻り値: true で WDT が原因, false で通常の起動

reason というレジスタがあり、この値がゼロでなければ WDT が原因で再起動したことになります。


watchdog_enable()

WDTを有効にする。

第1引数: watchdog_update()が呼び出されずにWDTがリブートするまでのミリ秒数。最大値は0x7fffffで約8.3秒です。
第2引数: 1 (true) にするとデバッグ中にWDTが効かなくなります。
 デバッグ中にWDTが働いては困るので、これは便利です。


watchdog_update()

watchdog_enable() に設定された時間でカウンターをリロードします。


動作させてみる

それでは F5キーを押してプログラムを動作させてみます。

約5秒でリブートを繰り返します。
実行後の Tera Term の画面表示を貼っておきます。

いかがでしたか?
皆さんの番犬はうまく動きましたか?

お疲れさまでした。

WDTカテゴリの最新記事