S32K311 MCUにソフトウェアウォッチドッグタイマーを実装しようとしていますが、SWT 0インスタンスで問題が発生しています。
要件: 1秒のタイムアウト値を持つウォッチドッグを実装する必要があります。ソースクロックはSIRC (32Khz) SO、カウントは32000になります。これは、50%ウィンドウを持つウィンドウウォッチドッグである必要があります。つまり、カウントが16000を下回った後は、カウンタがダウンカウンタに更新されるだけです。
疑似コード:
初期化:
SWT_0.CR.R = 0xFF000188;
SWT_0.TO.R = 32000; // !ウォッチドッグの秒タイムアウト
SWT_0.WN.R = 16000; // カウントが下回ったらリフレッシュを実行する必要があります
SWT_0.CR.B.WEN = 1; // WDTを有効にする
s_time_since_last_refresh_ms = 0;
更新: 1 ミリ秒ごとにスケジューラで呼び出されます (時間は正確です)
if (s_time_since_last_refresh_ms > 700) //時間のジッタによる問題が発生しないように、500 ミリ秒ではなく 700 ミリ秒を維持しました
{
SWT_0.SR.R = 0xA602;
SWT_0.SR.R = 0xB480;
s_time_since_last_refresh_ms = 0;
}
スケジューラのタイミングは正しく、PINの切り替えでテストされていますが、700ms後にリフレッシュがシステムリセットと呼ばれる問題が発生します。
しかし、同じ構成をウィンドウモードから通常モードにスイッチすると、ピンを切り替えることでリセットなしで永久に実行されることが確認され、期待どおりに動作します。
リセットをチェックしましたが、リセット レジスタには SWT しかありません。
700ms経過時のリフレッシュAPI内のカウント値を確認したところ、カウントは16000未満で正確でした。
しかし、カウント値を取得するには、ウォッチドッグを無効にする必要があります。そうしないと、カウントを読み取ることができないため、何が間違っているのかわかりません。
問題の原因を教えていただけませんか?SDKで提供されているサンプルコードが使えません。SDKが使用しているサンプルコードも確認しましたが、SWTで正しく動作させるために他のペリフェラルの設定を見落としているのでしょうか?
そのような制限はないと思います。
私たちはこの問題に多くの時間を費やしてきましたが、実用的な例を示しました。まだ質問がある場合は、プロジェクト全体を提供していただければ、考えられる原因の調査をお手伝いします。
こんにちは@Senlent
指定されたワークスペースは期待どおりに動作しています。そこからバイナリを取得してコンパイルしたところ、いくつかの問題が発生しました。しかし、S32DS IDEs で作成されたアプリケーション ワークスペースでは、同じ手順が機能しません。SWT0 を適切に実行するために、何らかの事前構成が必要な可能性はありますか。
わかりました@Senlent 、了解しました。同じことを更新してみます。また更新してくれてありがとう。
ハードウェアは S32K31XEVB をベースにしており、IDEs は S32 DS V3.6.2 + RTD 6.0.0 です。
青色 LED は 700 ミリ秒の周期で切り替わります。
更新情報をありがとうございます。CAN、ワークスペース全体を共有していただけますか。私も同じハードウェアを持っているので、自分のセットアップでテストしてみます。
こんにちは@AKV
追加の手順は必要ありません。
このプロジェクトは、S32K311EVB ハードウェアでテストされています。まだ質問がある場合は、ビデオを録画することもCAN。
自分のワークスペースでコードをテストしましたが、以前と同じように動作しません。事前の構成は必要ですか。
以下は私のテストプロセスです。ベアメタルコードは次のとおりです。RTD は 6.0.0 です。
そして期待通りに動作します。
IP_SWT_0->CR &= ~SWT_CR_WEN_MASK;
IP_SWT_0->CR |= SWT_CR_WND_MASK;
IP_SWT_0->WN = 16000;
IP_SWT_0->TO = 32000;
IP_SWT_0->SR = 0xA602;
IP_SWT_0->SR = 0xB480;
IP_SWT_0->CR |= SWT_CR_WEN_MASK;
void PitNotification(void)//1ms
{
if(s_time_since_last_refresh_ms>700)
{
IP_SWT_0->SR = 0xA602;
IP_SWT_0->SR = 0xB480;
/* Toggle the gpio pin to blink the LED when the Pit notification is called */
Siul2_Dio_Ip_TogglePins(LED_PORT, (1UL << LED_PIN));
s_time_since_last_refresh_ms = 0;
}
else
{
s_time_since_last_refresh_ms++;
}
}
AKV_0-1754250520948.png
これはMC_RGMレジスタの値をリセットした後です