まず、独立したウォッチドッグ機能
エラーがチップに信号を再起動の問題で発生した時点で定期的には、チップ内部の状況を表示します。ウォッチドッグ・コマンドは、最も優先順位の高い割り込みプログラムを実施しています。
第二に、独立したウォッチドッグSTM32ステップの開始
①、IWDG_KR書き込みレジスタに0x5555で。そして、リアの両方のレジスタを操作することができるように、書き込み保護IWDG_PR IWDG_RLRをキャンセルします。
IWDG_PR IWDG_RLR値と分周比の設定値を設定し、ウォッチドッグをリロード。
DOG監視時間計算:Toutを=((4×2 ^ PRER)×RLR)/ 40
前記Toutが(ミリ秒)監視時間である。PRERウォッチドッグクロックプリスケーラ値(IWDG_PR値)、0〜7の範囲、値(IWDG_RLRの値)をリロードRLRウォッチドッグ。例えば、我々は値PRER 4、RLR値625を設定し、それにTOUT = 64×40分の625 = 1000msのは、そのようなウォッチドッグ時間は一度、限り、あなたは1秒以内であるとして、1秒で取得することができますIWDG_KRに0XAAAAを書かれた、(何度も書くことが可能にももちろん)ウォッチドッグリセットにつながることはありません。
これは、ウォッチドッグのクロックが犬を養うとき、それは遅すぎる、そうでない場合、それはウォッチドッグリセットが起こるかもしれませんが最良であるので、正確な40kHzのではないことを皆に思い出させる必要があります。
②IWDG_KRに0XAAAAを書きます。
句によって、STM32は、値IWDG_RLRの内側にウォッチドッグカウンタをリロードします。すなわち、独立ウォッチドッグ操作は犬を養います。
③書き込み0XCCCC IWDG_KR。
フレーズによってSTM32ウォッチドッグを開始します。有効にしたら、それはオフにすることはできませんでIWDGに注意してください!私は、オフにしたいだけ再起動し、それ以外の場合は、再起動後に問題のある遺跡をIWDGを開くことができません。
だからここIWDG、思い出さない場合は、その後、トラブルないように、それを開くするつもりはありません。
第三に、ソフトウェア設計
wdg.c
#include " wdg.hは" // 独立ウォッチドッグを初期化 @ PRER:分周数:0〜7(唯一の下位3ビット!) @ 周波数分割係数= 4 * 2 ^ PRERだけ最大値。 256! @ RLR:リロードレジスタの値:下位11ビットが有効です。 // 時間の計算(概算):Toutを=(。(2 * ^ PRER 4)* RLR)/ 40(MS) のボイドIWDG_Init(U8 PRER、 RLR U16) { IWDG - > KR = 0x5555で ; // のIWDG-> PR及びIWDG-> RLRへの書き込みを有効 IWDG-> PR = PRER; // 設定された周波数分割ファクタ IWDG-> RLR = RLR; // から負荷登録IWDG-> RLR、 IWDG-> KR = 0xAAAA ; // リロード IWDG-> KR = 0XCCCC ; // ウォッチドッグを有効にします } // ちょっと独立ウォッチドッグ 空隙 IWDG_Feed(ボイド) { IWDG - > KR = 0xAAAA ; // リロード }
wdg.h
#ifndefの__WDG_H の#define __WDG_H の#include " sys.h " ボイドIWDG_Init(U8 PRER、U16 RLR)。 空 IWDG_Feed(無効)。 #endifの
主な機能
INT(メインボイド) { (Stm32_Clock_Init 9); // システムクロック delay_init(72); // 遅延初期化 uart_init(72、9600); // 初期化シリアルポート LED_Init(); // LEDに接続されたハードウェアの初期化インターフェース KEY_Init(); // キー初期化 Delay_ms(300); // 可視オフさせ IWDG_Initを(4、625); // 625が過負荷され、分割数が64であると、オーバーフロー時間LS LED0 = 0。// 照明LED0 間(1 ) { IF(KEY_Scan(0)== WKUP_PRES)IWDG_Feed(); // WK_UPが押された場合、イヌ Delay_ms(10 ); }; }