Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

EZ-PD™ PMG1 MCU: USB PDファームウェアにおけるウォッチドッグタイマ(WDT)の使用方法 - KBA237291

EZ-PD™ PMG1 MCU: USB PDファームウェアにおけるウォッチドッグタイマ(WDT)の使用方法 - KBA237291

Infineon_Team
Employee
Employee
50 replies posted 25 likes received 25 replies posted

Translated by: HiKu_1337496

Original KBA: EZ-PD™ PMG1 MCU: Usage of watchdog timer (WDT) in USB PD firmware - KBA237291

 

本KBAでは、USB パワーデリバリー(PD)用EZ-PD™ PMG1 (パワー デリバリー マイクロコントローラ Gen 1)MCUのUSB PDファームウェア実装において、ウォッチドッグタイマー(WDT)がどのように使用されるかを説明します。さらに、予期せぬファームウェアのクラッシュやロックアップからシステムを保護するために、USB PDファームウェアでWDTベースのシステムリセット生成を構成する詳細についても説明しています。

1. USB PDファームウェアは、PD機能の操作にウォッチドッグタイマー(WDT)を使用しますか?

EZ-PDTM PMG1デバイスに実装されたUSB PDファームウェアは、PD関連の多くのタスクを実行する上で重要なソフトウェア・タイマーをトリガーする定期的な割り込み発生装置として、ウォッチドッグ・タイマー(WDT)を使用します。

2. WDT は、USB PD ファームウェアにおいて、CPU を保護するためのシステム・リセット生成用の独立したタイマーとして使用することができますか?

USB PDファームウェアでは、WDTは定期的な割り込みをトリガーとしたPDスタック動作のタイミングと、CPUを保護するためのリセット生成の両方を担っています。しかし、このデュアルロジックの実装には、本記事でさらに説明するように、いくつかの注意点があります。

EZ-PDTM PMG1デバイスのウォッチドッグ・タイマー:

PMG1デバイスのWDTは、ILO(内部低周波発振器 ~40kHz)が生成するLFCLK(低周波クロック)から動作する16ビットのフリーランニング・ラップアラウンド・アップカウンタです。WDTは、最大1638ミリ秒(40kHzクロック使用時)の周期で、それぞれ設定可能な定期的な割り込みを生成します。

Infineon_Team_0-1679306273344.png

 

 

 

 

 

 

図1 EZ-PD™ PMG1デバイスのウォッチドッグ・タイマー・ブロック

割り込み周期を調整するためのパラメータは、以下の2つです:

・ マッチ値
・ 無視ビット

WDTカウントがマッチ値に達するたびに、割り込みが発生します。ただし、次のマッチ値は、WDT ISR(割り込みサービスルーチン)で、現在のWDTカウント値をマッチ値に加算して計算する必要があります。同様に、無視ビットは、16ビットWDTカウントレジスタで無視するビット数を指定します。

例えば、無視ビットを「2」に設定すると、WDTは14ビットカウンタとなります。 WDTがシステムクラッシュから保護するために使用される場合、メインファームウェアループからウォッチドッグに供給することによってWDT割り込みを定期的にクリアする必要があります。ファームウェアが2回連続してWDT割り込みをクリアしない場合、3回目のマッチイベントでハードウェアリセットが発生します。

WDTの一般的な用途は次の通りです:

・ファームウェアで様々なタスクを実行するための周期的な割り込みジェネレータ
・予期しないファームウェア実行パスまたは電圧低下の場合に、システムリセットをトリガーするリセットジェネレータ
・低消費電力モード(スリープ、ディープスリープ)時のウェイクアップソース

USB PDファームウェアにおけるWDTの使用方法:

1. PDファームウェアのトリガータイマとしてのWDT

USB PDファームウェアでは、WDTは定期的な割り込みを発生させるためのタイマーとして設定されています。関連する割り込みサービスルーチン(ISR)は、ソフトウェアタイマーをトリガーするために使用されます。これらのソフトウェアタイマは、Type-CやPDに関連するさまざまなタスクを担当します。システムがディープスリープモードで動作する場合、WDTは、PDの定期的なタスクを実行するために必要なときにシステムをウェイクアップするためにも使用されます。これは、消費電力を抑えるためにシステムをディープスリープモードで動作させる、バッテリー駆動のアプリケーションに最適です。次のコードは、WDT割り込みハンドラを示しています。

static void wdt_interrupt_handler(void)
{

/* Clear WDT pending interrupt */
Cy_WDT_ClearInterrupt();


#if (CY_PDUTILS_TIMER_TICKLESS_ENABLE == 0)
/* Load the timer match register. */

Cy_WDT_SetMatch((Cy_WDT_GetCount() + gl_TimerCtx.multiplier))

#endif /* (CY_PDUTILS_TIMER_TICKLESS_ENABLE == 0) */

/* Invoke the timer handler. */
Cy_PdUtils_SwTimer_InterruptHandler(&(gl_TimerCtx));

}

2.USB PDファームウェアのシステムリセット発生器としてのWDT

USB PDファームウェアでは、WDTは周期的な割り込みジェネレータとして設定されています。したがって、WDTをシステムリセットジェネレータとして直接使用することは不可能です。これは、WDT割り込みがWDT割り込みハンドラ自体からクリアされるため、メインファームウェアのループでロックアップが発生しても、リセットをトリガーするために必要なウォッチドッグ割り込みがクリアされないためです。

しかし、USB PD コードは、メイン ファームウェア ループまたは WDT 割り込みハンドラーでのクラッシュからファームウェアを保護するように記述されています。次のコード スニペットに示すように、ModusToolbox™ の USB PD プロジェクト ファイルの下にある config.h ファイルで定義された 2 つのマクロを使用して、これらの独立したアクションの両方を有効/無効にすることができます。

/* Enable watchdog hardware reset for CPU lock-up recovery */
#define WATCHDOG_HARDWARE_RESET_ENABLE (1u)

/* Disable device reset on error (watchdog expiry or hard fault). */
#define RESET_ON_ERROR_ENABLE (1u)

/*
* Watchdog reset period in ms. A lower value will increase the power
consumption in the
* system due to frequent system wakeup in Deep Sleep mode operation.
*/

#define WATCHDOG_RESET_PERIOD_MS (750u)

WATCHDOG_HARDWARE_RESET_ENABLE

このマクロは、WDTリセット機能を有効にするために使用されます。このマクロを値「1」で有効にすると、WDT割り込みハンドラの定期的な実行がブロックされ(優先順位の高い割り込みの処理中またはクリティカルセクション内でロックアップが発生する場合があります)、その結果、クリアされないWDT割り込みが保留される場合にデバイスリセットが発生します。しかし、このマクロを有効にすると、WDT ISRの実行をブロックしないメインファームウェアのループで発生するクラッシュからシステムを保護することはできません。

RESET_ON_ERROR_ENABLE

このマクロは、ファームウェア本体でのクラッシュからシステムを保護する役割を担っています。このマクロを有効にすると、グローバル変数 gl_main_loop_delay がメイン ファームウェア ループから頻繁にクリアされます。一方、この値はウォッチドッグタイマーコールバック内でインクリメントされます。メインファームウェアループがクラッシュした場合、この変数はクリアできず、この変数のインクリメント値は「3」を超えて増加します。この条件では、次のコードに示すように、ウォッチドッグ・タイマー・コールバックから手動リセットが発行されます:

/*
* It is possible that this timer is the only reason for the device to wake
* from sleep.
* Hence allow three consecutive timer expiries before resetting the device.
*/
gl_main_loop_delay++;
if (gl_main_loop_delay > 3)
{
   if(gl_instrumentation_cb != NULL)
   {
      gl_instrumentation_cb(0, INST_EVT_WDT_RESET);
   }

   /* Store the reset signature into RAM. */
   gl_runtime_data_addr[WATCHDOG_RESET_OFFSET] = WATCHDOG_RESET_SIG;
   NVIC_SystemReset();

}

WDT functional flowchart for USB PD firmware.png

図2 USB PDファームウェアのWDT機能フローチャート

USB PDファームウェアにおけるWDTベースのシステムリセット時間の設定:

上述したように、WDT割り込み周期は、ファームウェアのクラッシュ後にシステムリセットをトリガーするのにかかる時間の原因となっています。割り込み周期を調整するための設定パラメータは、「マッチ値」と「無視ビット」です。「マッチ値」は、WDT ISRでマッチ値を毎回インクリメントできる場合にのみ、割り込み周期を設定するために使用できます。しかし、WDT ISRでロックアップが発生すると、次のマッチ値の更新に失敗します。そのため、WDT ISRでロックアップが発生した場合は、メイン関数内で以下のAPIを呼び出すことで、無視ビットのみ使用してWDT割り込み周期のコース調整を設定します:

Cy_WDT_SetIgnoreBits(IGNORE_BITS);

ここで、IGNORE_BITS引数は、16ビットWDTカウントレジスタで考慮するビット数を指定します。無視ビット数が多いほどWDTの割り込み周期が短くなり、その分リセット時間が短くなります。例えば、40kHzのILOクロック周波数の場合、IGNORE_BITSを「2」に設定すると、最大WDT割り込み周期は410ミリ秒になり、リセット時間は1.23秒になります。

HiKu_1337496_0-1679658648175.png

 一方、メイン ファームウェア ループがクラッシュしてもWDT ISRの実行が続いている場合、WDT ISRの次のマッチ値を更新することで、WDT割り込み周期の微調整に使用することができます。これはファームウェアで行われ、WDT割り込み周期をconfig.hファイルで指定されたWATCHDOG_RESET_PERIOD_MSマクロの値に設定します。メイン ファームウェア ループがクラッシュした場合のリセット時間は、このマクロの値の 3 倍となります。

例: USB PDファームウェアでWDTを使用して1秒のリセット時間を設定する手順:

  • main.cファイルのCy_WDT_SetIgnoreBits()API関数を使用して、初期化コードの一部としてWDT無視ビットを「2」に設定します。これにより、WDT周期は16384 ILOクロックサイクルに対応する最大値に制限されます。HiKu_1337496_1-1679658759523.png

     

     

図3 WDT無視ビットの設定

  • WATCHDOG_HARDWARE_RESET_ENABLEマクロとRESET_ON_ERROR_ENABLEマクロの両方を有効にするには、値を「1」に設定します。

  • config.h の WATCHDOG_RESET_PERIOD_MS マクロの値を、無視ビットで設定した最大 WDT 割り込み周期(ILO クロック 40kHz で最大 410ミリ秒)より 5%(WDT周期許容値)小さい値に設定します。値を380ミリ秒と設定すれば十分です。

    HiKu_1337496_2-1679658759532.png

     

    図4 WDTベースのシステムリセット機能に必要なマクロの有効化

システム消費電力とWDT割り込み周期の関係:

動作クロック周波数の上昇に伴い、システム消費電力が増加するのが一般的です。ディープスリープ動作のUSB PDファームウェアを考慮すると、システムはWDT割り込みごとに定期的に起動され、アクティブモードのタスクを実行した後、再びディープスリープに戻ります。

システムがPDコントラクトに入ると、クリティカルなイベントが発生しない限り、通常はWDTがCPUのウェイクアップに使用されるソースとなります。したがって、リセットタイミングはWDTの割り込み周期に依存し(前述)、WDTのリセット時間が短くなるように設定すると、CPUがディープスリープから目覚める割合も高くなります。これにより、システム全体の消費電力がわずかに上昇します。そのため、バッテリー駆動のシステムでは、WDTの割り込み時間を長くすることが理想的です。

ケース1:

PMG1デバイスがアクティブモードで消費する電流を10mA(標準値)、ディープスリープで消費する電流を500μAとする(PMG1-S1データシートのSID_DS3仕様による)。アクティブモード動作の周期を1ミリ秒(アプリケーションに依存)と仮定すると、WDT割り込み周期に対するPMG1デバイスの平均消費電流を表1に示します。システムの消費電力は、消費電流に線形に比例します。

表1 平均システム電流とWDT割り込み期間の関係

HiKu_1337496_3-1679658759062.png

 

 

 

 

 

 

 

 

 

 

 

注)上記の電力データは、アクティブモードの継続時間を1ms、ディープスリープ電流を500μAと仮定した場合の消費電流を表しています。ただし、PMG1デバイスのUSB PDファームウェア動作では、上記計算で想定した任意の値よりもはるかに低い値になります。

HiKu_1337496_4-1679658759059.png

 

 

 

 

 

 

 

図5 PMG1デバイスが消費する電流のウォッチドッグタイマー周期依存性を示すグラフ

ケース2:

例: リセット時間が 1 秒の USB PD DRP (デュアルロール電源) 動作の PMG1 デバイスの消費電力

PMG1デバイスがディープスリープモードで消費する電流の標準値は、WDTウェイクアップ、CCウェイクアップ、およびADC/CSA/UVOVを有効にした場合で約500μAです(PMG1-S1データシートのSID_DS3仕様を参照)。アクティブモード動作の持続時間はアプリケーションに依存し、USB PD DRPファームウェアでは約185μsとなります。

1秒のリセット時間を設定するために,IGNORE_BITS値を「2」にして,214WDTカウントに相当する最大WDT割り込み周期の上限を設定します。ILOのクロック周波数を40kHzとすると、WDT割り込み周期は以下のように計算されます:

HiKu_1337496_5-1679658759087.png

 

WDT ISRのロックアップに伴うリセット時間は、上記計算値の3倍(3×409.6=1.23秒)です。

メインファームウェアループでロックアップが発生した場合のリセット時間は、config.hファイルに定義されたWATCHDOG_RESET_PERIOD_MSマクロで決定されます。この値は、上記で計算した最大WDT割り込み周期409.6ミリ秒より大きくならないようにする必要があります。したがって、ILOクロック周波数の不正確さを考慮し、このマクロに少し低い値(例えば380ミリ秒)を使用することが推奨されます。

USB PDファームウェアで上記の設定を行った場合のPMG1デバイスの消費電力(平均消費電流)は、以下のように計算されます:

HiKu_1337496_6-1679658759061.png

 

WDT動作のILO精度:

内部低周波発振器(ILO)は低電力モードで動作可能で、LFCLKクロックの生成に使用されます。LFCLK周波数の標準値は40kHzで、±50%の精度です。ウォッチドッグタイマーはILOが生成するLFCLKから直接電源を供給されるため、その周波数の変動はWDTの割り込み周期に決定的な影響を与え、ひいてはリセット時間や特定の定期的なファームウェアタスクの実行に影響を与えます。そのため、USB PDファームウェアにはキャリブレーション機能が組み込まれており、システム起動時に、実際のWDTの周期を、比較的正確な内蔵メインオシレーター(IMO)クロックで動作するArm®システムタイマー(SysTick)の周期と比較することができます。

SysTickのタイミングに対するWDTのタイミングの不一致に基づいて、マッチ値を調整することによって必要な適切な補償時間を追加することによってWDTが調整されます。こうして達成されたウォッチドッグ・タイミングは、ファームウェアによって指定された値の±5%以内に収まっています。

注)上記のキャリブレーションはWDTマッチ値の調整によって行われるため、WDT ISRが定期的に実行されている間のみ有効です。また、メインファームウェアループクラッシュ時の手動リセット時間はWDT ISRの実行周期に依存するため、このリセット時間はWATCHDOG_RESET_PERIOD_MSマクロで指定された値の3倍の5%以内の精度になります。

しかし,WDT ISRの実行中にロックアップが発生した場合,WDTのマッチ値を更新できなくなるため,キャリブレーションは無効となります。その後、WDT割り込みはIGNORE_BITSで指定された期間だけILOの50%精度で発生します。したがって、WDT ISRがロックアップした場合のリセット時間には、50%の許容誤差がある場合があります。

注:上記のウォッチドッグタイマーのキャリブレーションは、デバイスの起動時にのみ行われるため、ファームウェアに動的なキャリブレーションは含まれていません。したがって、温度などの外的要因によるILOクロック周波数の偏差は、現在のファームウェアでは補正されません。

WDT割り込み周期の極大値

USB PDファームウェアでWDT周期に割り当てられる最大値と最小値は、いくつかのパラメータに依存します。WDT周期を短くすると、表1および図3に示すように、システムの消費電力が増加します。

5ミリ秒未満の非常に短い周期値は、CPUによる通常のPDスタックタスクの実行に干渉する可能性があります。一般に、電力を節約するためには、WDT周期の値を高くすることが推奨されます。ただし、CY_PDUTILS_TIMER_HW_MAX_TIMEOUT(cy_pdutils_sw_timer.hファイルで定義されたマクロ)で指定されたILOクロックサイクル数に対応するタイマー周期値が上限です。これより大きい周期値は冗長であり、何のメリットもありません。この値を超えると、ファームウェアの動作により、この周期が複数の短い間隔に分割されるからです。このWDT周期の上限は、ILOのクロック周波数が40kHzの場合、1.64秒となります。

/* Start the timer if not already running. */
context->start_tick = cur_count;
    count = p_timer_handle[index].count;
    if (count > CY_PDUTILS_TIMER_HW_MAX_TIMEOUT)
    {
        count = CY_PDUTILS_TIMER_HW_MAX_TIMEOUT;
    }
    context->tick_time = (uint16_t)count;
    TIMER_CALL_MAP(Cy_PdUtils_HwTimer_LoadPeriod) (context,(uint16_t)(count + cur_count));
    TIMER_CALL_MAP(Cy_PdUtils_HwTimer_Start) (context);

0 件の賞賛
204 件の閲覧回数