STM32CubeMXシリーズ|ウィンドウウォッチドッグ

ウィンドウウォッチドッグ

1.ウィンドウウォッチドッグの概要

ウィンドウウォッチドッグ(WWDG)は通常、T6ビットが0になる前にダウンカウンターの値が更新されない限り、外部の障害またはアプリケーションが通常の動作シーケンスから逸脱する予期しないロジック条件によって引き起こされるソフトウェア障害を監視するために使用されますウォッチドッグ回路がプリセット時間に達すると、MCUリセットが生成され、ダウンカウンターがウィンドウレジスタ値に達する前に、7ビットのダウンカウンター値が更新されると、MCUリセットも生成されます。したがって、ダウンカウンターは限られた時間枠で更新する必要があります。その主な機能は次のとおりです。

  • プログラム可能なフリーランニングデクリメント計算機
  • 条件付きリセット:ダウンカウンターの値が0x40未満の場合はリセットが発生し、ダウンカウンターがウィンドウの外に再読み込みされるとリセットが発生します
  • ウォッチドッグが有効で割り込みが有効になっている場合、ダウンカウンターが0x40に等しいときに早期ウェイクアップ割り込み(EWI)が生成され、これを使用してカウンターをリロードしてWWDGリセットを回避できます。

ウォッチドッグのブロック図

ここに画像の説明を挿入
ウィンドウウォッチドッグのタイミング図

ここに画像の説明を挿入
上図では、T [6:0]はウィンドウウォッチドッグのカウンター、W [6:0]はウィンドウウォッチドッグの上部ウィンドウ、下部ウィンドウは固定値(0x40)
です。WWDGカウンターの周波数はPCLK1 /( 4096 *カウンタープリスケーラー値)、PCLK1クロック周波数が高すぎるため、4096
WWDGタイムアウト時間で割る:(4096 *カウンタープリスケーラー値)*(T [5:0] +1)/ PCLK1、ここではT [ 5:0] +1はT [6:0] -0x3Fです

2.ハードウェア設計

USART1を使用してデバッグ情報を出力し、PC0を使用してプログラムがリセットされたかどうかを示します。

ここに画像の説明を挿入

3.ソフトウェア設計

3.1 STM32CubeMX設定
  • RCCは外部HSEを設定、クロックは72Mに設定、WWDGクロックはAPB1にマウント
  • PC0はGPIOプッシュプル出力モード、プルアップ、高速に設定され、デフォルトの出力レベルは高
  • USART1は非同期通信モードとして選択され、ボーレートは115200ビット/秒に設定され、送信データ長は8ビット、パリティなし、1ストップビットです。

ここに画像の説明を挿入

  • WWDGをアクティブにし、カウンタープリスケーラー値を8に設定し、ウィンドウレジスタをW [6:0] = 0x5Aに設定し、デクリメントカウンターリフレッシュ値をT [6:0] = 0x7Fに設定します。式に従って、タイムアウト時間は(4096 * 8 )*(127-63)/ 36MHz = 53.8ms; NVIC設定でEWI割り込みを有効にし、ウィンドウウォッチドッグ割り込みを開く

ここに画像の説明を挿入

  • プロジェクト名を入力し、プロジェクトパス(中国語以外)を選択し、MDK-ARM V5を選択します。IPごとに「.c / .h」ファイルのペアとして生成されたペリフェラルの初期化を確認します。「コードを生成」をクリックしてプロジェクトコードを生成します
3.2 MDK-ARMプログラミング
  • ウィンドウウォッチドッグの初期化関数をwwdg.cファイルで確認できます。
void MX_WWDG_Init(void){
    
    
  hwwdg.Instance = WWDG;
  hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
  hwwdg.Init.Window = 0x5a;
  hwwdg.Init.Counter = 0x7f;
  hwwdg.Init.EWIMode = WWDG_EWI_ENABLE;
  if (HAL_WWDG_Init(&hwwdg) != HAL_OK){
    
    
    Error_Handler();
  }
}

ウィークシンボルの早期ウェイクアップ割り込み関数のプロトタイプを見つけ、wwdg.cのコールバック関数をカスタマイズします
__weak void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef * hwwdg)

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg){
    
    
	HAL_WWDG_Refresh(hwwdg);	//在早期唤醒中断函数中喂狗
}
  • main関数にコードを記述します。犬が早期ウェイクアップ割り込み関数で正常に供給された場合、whileループの1秒ごとに出力されます
int main(void){
    
     
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_WWDG_Init();
  /* USER CODE BEGIN 2 */
  printf("\r\n***** AndyXi WWDG test program *****\r\n");
  HAL_Delay(10);
  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);
  /* USER CODE END 2 */
  while (1){
    
    
 	printf("\r\nHello WWDG...\r\n");
	HAL_Delay(10);
  }
}

4.ダウンロードの確認

  • 犬が早期ウェイクアップ割り込み機能で正常に供給された場合、プログラムはリセットされず、メッセージがwhileループで1秒ごとに出力され、LED1が点灯します

ここに画像の説明を挿入

  • 早期ウェイクアップ割り込み機能のフィードドッグ機能がコメントアウトされている場合、プログラムは常にリセットされ、LED1が点滅します

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Chuangke_Andy/article/details/108583716