SSブログ

PSoC 40xx でウォッチドッグ・タイマを使ってみる [PSoC]このエントリーを含むはてなブックマーク#

ウォッチドッグ・タイマを周期タイマに使う

前回の記事では、専用タイマモジュールである TCPWM を使わずに SysTick を使って周期的なタイマを実現しました。 今回は、もうひとつのタイマ Watchdog Timer (WDT: ウォッチドッグ・タイマ)を使って周期的なタイマを実現します。

ウォッチドッグ・タイマの役割

ウォッチドッグ・タイマのブロック図

ウォッチドッグ・タイマのそもそもの役割は、プログラムが動作しているかどうかを確認する事です。 ユーザが書いたプログラムは、定期的にウォッチドッグ・タイマに「生きてるよ」と知らせます。 もちろん、声をかけるのではなく、ウォッチドッグ・タイマのレジスタに特定の値を書きこむ事で、プログラムが生きている事を通知します。

ウォッチドッグ・タイマは、プログラムからの「生きてるよ」通知を監視していて、ある一定の時間を超えて通知が来なくなったら、「プログラムが暴走を始めた」と判断してリセットをかけます。 すると、リセットをかけられたプログラムは、再び、正常な動作をするようになるという仕組みです。

ウォッチドッグ・タイマは、内蔵低速発振器 (Internal Low-speed Oscillator: ILO) で駆動される16ビットのタイマを持っていて、このタイマで割り込みを発生させます。 ILO の発振周波数は、標準値で 40kHz なので、ウォッチドッグ・タイマが発生する割り込み間隔は、1.6秒ほどです。 実際には、割り込みまでの時間を設定する仕組みも入っていますので、「最大1.6秒」ということになります。

ウォッチドッグ・タイマが発生した割り込みが処理されず、ふたたび割り込みを発生する状態になると、ウォッチドッグ・タイマは「暴走」を確信し、リセットをかけます。

ここまでの解説は、ウォッチドッグ・タイマの本来の使い方です。 もし、割り込みが発生したところで、確実に割り込み処理を行ったとすると、周期的に動作するタイマとして動作させる事ができます。

ILO クロックの周波数は、いくつだろう?

データシートにある ILO の解説

この記事を書いている時点では、PSoC 40xx シリーズのデータシートによると、 ILO の発振周波数は、標準値で 40kHz となっています。 ところが、 Architecture Technical Reference ManualRegisters Technical Reference Manual と呼ばれる文書では、 32kHz が標準となっています。 確認したところ 40kHz の方が正しい値のようです。

ただし、 ILO の発振周波数の仕様は、 20kHz から 80kHz とかなり広範囲にわたっています。 そのため、 32kHz と書いてあっても誤差範囲内に入ってしまいます。 あまり、信用しすぎないようにした方がよさそうです。

WDT を扱うコンポーネント

WDT出力を持つ Global Signal Reference コンポーネント

PSoC Creator のコンポーネント・カタログを探しても、ウォッチドッグ・タイマのコンポーネントはありません。 では、どうやってウォッチドッグ・タイマを使うかというと、 Global Signal Reference コンポーネントで取り扱います。

Global Signal Reference コンポーネントを回路図上に配置すると、一緒に Interrupt コンポーネントが付いてきます。 Global Signal Reference コンポーネントは、デフォルトの状態でウォッチドッグ・タイマの割り込み信号である WDT 信号が出力されます。 これだけで、ウォッチドッグ・タイマの割り込みを受け付ける仕組みが出来上がります。

ウォッチドッグ・タイマのコード

ウォッチドッグ・タイマの初期設定

ウォッチドッグ・タイマは、コンポーネントとして提供されるわけではないので、初期設定などをコードとして書かなくてはなりません。 初期設定は、このようになっています。


  1. ウォッチドッグ割り込みを受けとる Interrupt コンポーネントを初期設定する。
  2. 割り込みまでのカウント数を MATCH レジスタに書き込む。
  3. ウォッチドッグ割り込みを許可する。
  4. ウォッチドッグ・タイマを起動する。

この後、全体の割り込みを許可すると、 MATCH レジスタに設定した時間が経過した後、ウォッチドッグ割り込みが発生します。


割り込み周期の設定

このファームウェアでは、前回の SysTick モジュールと同様、1秒間に100回割り込みが発生するように設定しています。 ただし、使用するクロックが、 40kHz ですので、割り込み間隔カウント数の計算部分が異なっています。


割り込み処理ルーチン

割り込み処理ルーチンは、 TCPWMSysTick を使用する場合と少々異なっています。 これは、ウォッチドッグ・タイマが、フリーランニングタイマという種類に分類されるからです。 たとえば、 SysTick を使う場合、カウンタがある値に一致したら、カウンタの値が自動的にリロードされます。 そのため、特別にタイマを操作する必要はありません。

ところが、フリーランニングカウンタの場合、カウンタ値が一致してもリロードは行われません。 また、カウンタの値をソフトウェアから書き換える事もできません。 そのため、周期的なタイマとして使う場合には、次に割り込みを発生させるべきカウンタ値を MATCH レジスタに書き込んで、割り込み周期を規定します。

その他、ウォッチドッグ割り込みに関連する割り込みフラグを確実にクリアする必要があります。 これも、ウォッチドッグ・タイマがコンポーネントとして提供されていないがゆえに必要な操作です。

プロジェクトアーカイブ

この記事で作成したプロジェクトは、このファイルの拡張子を "zip" に変更すると再現できるようになります。 これまで同様、 LED の点滅パターンを少々変更しています。

参考文書

PSoC® 4: PSoC 4000 Family Datasheet: Programmable System-on-Chip (PSoC®)
PSoC 40xx シリーズのデータシートです。 電気的な特性に関しては、いちばん詳しい情報が掲載されています。
PSoC 4000 Family: PSoC® 4 Architecture Technical Reference Manual (TRM)
PSoC 40xx シリーズの内部構造を開設した文書です。 ウォッチドッグ・タイマについても、この文書に書かれていますが、あまり理解しやすいとはいえません。

関連文献

開発編 ARM PSoCで作るMyスペシャル・マイコン (トライアルシリーズ)

開発編 ARM PSoCで作るMyスペシャル・マイコン (トライアルシリーズ)

  • 作者: 圓山 宗智
  • 出版社/メーカー: CQ出版
  • 発売日: 2013/12/24
  • メディア: 単行本

nice!(0)  コメント(1)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 1

鈴木

watchdog timerを使って、0,1をデジタル出力できる脈拍センサからのあ値を読み取って脈拍を取りたいのですが、助けてくれませんか?
by 鈴木 (2016-01-19 17:27) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました