PSoC® 4000 ファミリのウォッチドッグタイマについて - KBA91373 - Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
Community Translated by MoTa_728816 Version: **
Translation - English: Watchdog Timer in the PSoC® 4000 Family – KBA91373
質問:
PSoC® 4000 ファミリのウォッチドッグタイマ (WDT) は他の PSoC 4100/4200 ファミリのものと比較してどう違うのでしょうか? PSoC 4000 WDT を定期的割込みに使用するのにはどうしたら良いでしょうか?
回答:
違い:
PSoC 4100/4200 ファミリは WDT 用に 3つのタイマ (2 x 16-bit と 1 x 16-bit) をもっていますが、PSoC 4000 ファミリは 16-bit のフリーランニング アップカウンタを1つもっているだけです。カウンタの設定も同様に限られています。PSoC 4100/4200 でぇあ、カウントを最初のイベントでリセット、3回目の未処理イベントでリセット、またはリセットをせずに割込みだけを発生するといった設定が可能でした。カウンタをカスケードすることも可能でした。これらファミリの WDT に関する包括的な情報は PSoC 4000 Family Architecture TRM の Chapter 12, “Watchdog Timer” をご参照ください。
動作:
PSoC 4000 ファミリの WDT はカウンタ値が比較レジスタ値と一致した時に割込みを発生することができる単純な 16-bit フリーランニング アップカウンタです。このカウンタは一致時に “0” にリセットされず、そのまま 0xFFFF までカウント後 “0” に戻ります。内蔵の 32 kHz の低速発振器 (ILO) で動き、停止することも無効にすることも出来ません。しかし、割込みとリセットの発生は無効にすることが可能です。もし有効に設定されている場合、WDT のシステムリセット機能が 3回目の未処理の WDT 一致イベント/割込み時にシステムリセットを発生します。
WDT が提供するもう一つの設定機能はカウンタのサイズを縮小する(bit数を減らす)というもので、16 bit から 1 bit 単位で減らすことが可能です。これは WDT_MATCH レジスタの IGNORE_BITS を使用することで実現されます。WDT レジスタの詳細については PSoC 4000 Family PSoC® 4 Registers Technical Reference Manual (TRM) の Chapter 13.1, “SRSSLT Register Mapping Details” をご参照ください。下記の表 1は CyLib.c で定義されている PSoC 4000 WDT の動きを制御する主な関数の一覧です。(PSoC® Creator™ System Reference Guide (cy_boot Component)) に同じものが掲載されています。
表 1. PSoC 4000 WDT の主な関数
関数名 | 説明 |
---|---|
CySysWdtDisable() | WDT のシステムリセットを無効にする |
CySysWdtEnable() | WDT によるシステムリセットを有効にする |
CySysWdtWriteMatch(uint16 match) | WDT が一致割込みを発生するための一致値を書き込む、3回目の未処理一致割込み時にシステムリセットが発生される |
uint16 CySysWdtReadMatch() | 現在の一致値を読み出す |
CySysWdtWriteIgnoreBits(uint8 bits) | カウンタビットサイズ中で無視するビット数を書き込む。初期値は 0 でカウンタは 16-bit、2 を書き込むとカウンタは 14-bit カウンタとなる。 |
uint8 CySysWdtReadIgnoreBits() | カウンダサイズ中で無視されているビット数を読み出す。 |
CySysWdtMaskInterrupt() | WDT の割込み発生を無効にするが、リセット機能は有効 |
CySysWdtUnmaskInterrupt() | CPU サービス用に WDT 割込みを有効にする。 |
WDT のシステムリセット機能が有効な場合、CPU のスタック/ハング状態からシステムリセットがアサートされるまでの時間は下記の計算で得られます。
Else,
上の式は一致値が一回だけ書き込まれていて、一致割込みの間に更新されていないことを仮定しています。
WDT を使用して定期的割込みを発生する:
多くのアプリケーションが大まかなタイミング合わせやウェークアップ用に定期的割込み発生を必要とします。これは特に低消費電力要求のあるアプリケーションでは顕著で、デバイスはスリープに入り、ILO 等の低消費電力のソースから割込みを受けてウェークアップします。PSoC 4000 ではこのようなアプリケーション用に低消費電力から割込みを発生することが可能なのは WDT だけです。しかし、WDT はフリーランニングカウンタの特性上、デフォルトでは定期的割込みを発生することができません。以降に WDT ISR を使用して定期的割込みを行う方法を示します;
- 表 1の API を使用して、希望の値を一致値レジスタに書込みます。例えば, 3200 なら 32 kHz クロックで約 100 ms の割込みとなります。
- WDT 割込みのマスクを解除して WDT を有効にします (システムリセット機能も必要な場合)。
- WDT ISR 内で、現在の一致値を読出し (表 1の API)、希望の一致値(割込みレート)をそれに加算して一致値レジスタに書き戻します。例えば、 WDT ISR が 3200 の一致値で発生した場合、3200 を読み出して、3200 (割込みレート 100 ms) を加算します。(合計で6400になります)。次に、カウンタ値が 6400 になったとtきに再度割込みを発生するように、6400 を一致値レジスタに書き戻します。カウンタはいつでもカウント値が比較値と一致したときに割込みを発生することに注意してください。定期割込みを発生する為には一致値を必要に応じて ISR 内で変更する必要があります。下記のコードスニペットは約 100 ms 間隔で割込みを発生するサンプルです。
コードスニペット:
CY_ISR(WDT_ISR) {
/* WDT 割込みをクリアする */
CySysWdtClearInterrupt();
/* WDT_MATCH に現在の値に希望する一致を加えた値を書き込む */
CySysWdtWriteMatch((uint16)CySysWdtReadMatch()+3200);
}
int main() {
/* WDT_MATCH に希望の一致値を書き込む */
CySysWdtWriteMatch(3200);
/* CPU サービス用に WDT 割込みマスクを解除する */
CySysWdtUnmaskInterrupt();
/* WDT 割込みベクタを WDT ISR に設定する */
CyIntSetVector(4, WDT_ISR);
/* CPU ベクタで WDT ISR を有効にする - WDT 一致で発生する割込み */
CyIntEnable(4);
/* グローバル割込みを有効にする */
CyGlobalIntEnable;
/* アプリケーションコード */
}
注意: CPU 機能に障害を与えるような電源消失の可能性がある場合には、WDT を有効にしておくことが強く推奨されます。これにより CPU 機能障害を発生するような電源消失後にもシステムは必ず復旧できます。