独立したウォッチドッグ
1.独立したウォッチドッグの概要
ウォッチドッグは実際にはタイマーです。機能の点から見ると、プログラムで事故が発生すると(プログラムが無限ループに入ったり、プログラムが暴走したりした場合)、マイクロコントローラーは電源をオンにしたシステムに戻り、システムを問題から保護できます。一度再起動できます。さらに複雑なことに、ウォッチドッグはシステム
STM32を再起動できる独立したウォッチドッグ(IWDG)であり、内部の特別な40KHz低速クロックによって駆動され、メインクロックが故障しても、まだ有効です。IWDGクロックは内部RCクロックであり、30〜60KHzの間の可変クロックですが、見積り時に40KHzの周波数で計算していることに注意してください。ウォッチドッグの時間に関する要件は、あまり正確で
独立していません。ドアの機能ブロック図は以下の通りです。実際、独立したウォッチドッグはダウンカウンターであり、タイマーの値が0に減少すると、IWDGはリセット信号を生成し、システムはリセット後に再起動します。ウォッチドッグリセットを回避するには、カウンターが0に減少する前にカウンターをリロードする必要があります。プログラムエラーが発生すると、カウンターは更新されず、カウンターが0にデクリメントされ、システムがリセットされて再起動され、プログラムが誤って実行され続けるのを防ぎます。
独立したウォッチドッグタイムアウト時間(40KHz入力クロックLSI)
2.ハードウェア設計
USART1を使用してデバッグ情報を出力し、PC0を使用してプログラムがリセットされたかどうかを示します。
3.ソフトウェア設計
3.1 STM32CubeMX設定
- RCCは外部HSEを設定し、クロックは72Mに設定され、IWDGクロックはデフォルトでLSIクロックに設定されます
- PC0はGPIOプッシュプル出力モード、プルアップ、高速に設定され、デフォルトの出力レベルは高
- USART1は非同期通信モードとして選択され、ボーレートは115200ビット/秒に設定され、送信データ長は8ビット、パリティなし、1ストップビットです。
- IWDGをアクティブにすると、IWDGのクロックは40kHzになります。このとき、カウンタークロックを32で分周するように設定し、分周クロック周波数は1.25KHz(クロックサイクルは1s / 1250 = 0.8ms)で、ベースユニットのリロード値を減らします(ダウンカウンターのリロード値)は1000に設定されています。つまり、IWDGが800msで更新されない場合、システムはリセットされます
- プロジェクト名を入力し、プロジェクトパス(中国語以外)を選択し、MDK-ARM V5を選択します。IPごとに「.c / .h」ファイルのペアとして生成されたペリフェラルの初期化を確認します。「コードを生成」をクリックしてプロジェクトコードを生成します
3.2 MDK-ARMプログラミング
- 独立したウォッチドッグの初期化関数は、iwdg.cファイルで確認できます。
void MX_IWDG_Init(void){
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
hiwdg.Init.Reload = 1000;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK){
Error_Handler();
}
}
- main関数にコードを記述し、whileループで500ミリ秒ごとに犬に餌を与える
int main(void){
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_IWDG_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("\r\n***** AndyXi IWDG test program *****\r\n");
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_RESET);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1){
printf("\r\nRefreshes the IWDG...!\r\n");
HAL_IWDG_Refresh(&hiwdg);
HAL_Delay(500);
/* USER CODE END WHILE */
}
}
4.ダウンロードの確認
- 犬はwhileループで500msごとに供給されるので、プログラムはリセットされず、LED1は常にオンです
- whileループでドッグフィーディングアクションをコメントアウトすると、プログラムは常にリセットされ、LED1が点滅します