Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン32(リスタート時の原因確認)

STM32 (リスタート時の原因確認)

1.本日の内容

 (1) CubeIDEでリスタート処理が発生した時の原因を取得する方法について記載する。

  主に、下記リスタートのフラグを確認し、原因の特定が出来る。

 

  下記は、STM32F103xxの場合。

  ・PINRSTF:PINリセットフラグ

  ・PORRSTF:POR/PDRリセットフラグ

  ・SFTRSTF:ソフトウェアリセットフラグ

  ・IWDGRSTF:独立型ウォッチドッグリセットフラグ

  ・WWDGRSTF:ウィンドウ型ウォッチドッグリセットフラグ

  ・LPWRRSTF:低電力リセットフラグ

 

  下記は、STM32F401xxの場合  

  ・PINRSTF:PINリセットフラグ

  ・PORRSTF:POR/PDRリセットフラグ

  ・SFTRSTF:ソフトウェアリセットフラグ

  ・IWDGRSTF:独立型ウォッチドッグリセットフラグ

  ・WWDGRSTF:ウィンドウ型ウォッチドッグリセットフラグ

  ・LPWRRSTF:低電力リセットフラグ

  ・BORRSTF:BORリセットフラグ

 

  今回は、IWDGを動作させ、実際にIWDGによってリセットしたかどうか値を取得し、確認する。

  使用マイコン

 

・目次

 

2.内容

(1) リセット原因の確認方法

 ・上記、リスタートフラグは、制御/ステータスレジスタ(RCC_CSR)の値で確認できる。

 ・制御/ステータスレジスタについては使用するマイコンによって変わるので、データシートを参照する。

 参照:リファレンス マニュアル | STM32, STM8ファミリはSTの32bit/8bit汎用マイクロコントローラ製品

 

 ・データシートを参照すると下記のように記載している。

 ※RM0368データシートより抜粋

(2) リセット原因の意味

リセットフラグ 

内容 詳細
PINRSTF PINリセットフラグ

NRSTピンに外部からリセットトリガーが供給されることによるリセット

PORRSTF

POR/PDR

リセットフラグ

電源オンリセット(Power-On Reset)または

電源ダウンリセット(Power-Down Reset)の

発生を示すフラグ

SFTRSTF

ソフトウェア

リセットフラグ

プログラムの実行中にソフトウェアから発行されるリセット命令によるリセット
IWDGRSTF

独立型ウォッチドッグ

リセットフラグ

独立型ウォッチドッグによるリセット
WWDGRSTF

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

リセットフラグ

ウィンドウ型ウォッチドッグによるリセット
LPWRRSTF 低電力リセットフラグ バッテリの電力が復旧し、マイコントを自動的に再起動する機能による低消費電力リセット
BORRSTF BORリセットフラグ 電源供給が一時的に低下したり不安定になったりした場合に発生するリセット

詳細は下記記事を参照

 ・組み込み基礎知識(PINRSTF/PORRSTF/SFTRSTF/IWDGRSTFなどの意味)

 

(3) リセット原因の取得とクリア

プログラムで、RCCのステータスレジスタの取得と、リセットを行う。

#include "stm32f10x.h"   //(stm32f103の場合)
 
//リスタート原因取得関数
void GetSysResetSts()
{
	uint32_t ulSts;                          // リセットステータス
	
	// クリアステータスの取得
	ulSts = RCC->CSR & (RCC_CSR_PINRSTF | RCC_CSR_PORRSTF |
                        RCC_CSR_SFTRSTF | RCC_CSR_IWDGRSTF |
                        RCC_CSR_WWDGRSTF | RCC_CSR_LPWRRSTF);
 
     // リセットステータスの取得
     if (ulSts & RCC_CSR_SFTRSTF){
     	// ソフトウェアリセット時処理
     }

     if(ulSts & RCC_CSR_IWDGRSTF){
     	// IWDGリセット時処理
     }
     
     if(ulSts & RCC_CSR_WWDGRSTF){
          // WWDGリセット時処理
     }
     
     if(ulSts & RCC_CSR_PORRSTF){
     	// POR/PDRリセット時処理
     }

     if(ulSts & RCC_CSR_PINRSTF){
	//ピンリセット時処理 
} if(ulSts & RCC_CSR_LPWRRSTF){ // 低電力リセット時処理 } // リセットステータスのクリア RCC->CSR |= RCC_CSR_RMVF; }

 

 ・RCC_CSR_SFTRSTF/RCC_CSR_IWDGRSTF/RCC_CSR_WWDGRSTF/RCC_CSR_PORRSTF

 RCC_CSR_PINRSTF/RCC_CSR_LPWRRSTF/RCC_CSR_RMVF

 これらは、stm32f401xe.hに定義される。

 グレップで検索を行うと、確認できる。

 ・RCC_CSR_RMVFのフラグを立てることにより、リセットステータスをクリアできる。

 

(4) STM32F401REで確認

 実際に、上記プログラムの動作をSTM32F401REを使用して確認する。

 今回は、IWDGを有効にして、IWDGでリセットされた場合、

 LEDを消灯させる。

 IWDGのCubeMXの設定については、下記ブログを参照

 →STM32マイコン23(WDTでプログラム暴走時のリスタート処理) - Project_OKI’s diary

 また、PA 5をGPIO出力のHIGHの設定にする。

 

 

 ・プログラムの作成

/* USER CODE BEGIN PFP */
void GetSysResetSts();
/* USER CODE END PFP */
 /* USER CODE BEGIN 2 */
  GetSysResetSts();
 /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
//リスタート原因取得関数
void GetSysResetSts()
{
	uint32_t ulSts;                        ///< リセットステータス

	/// クリアステータスの取得
	ulSts = RCC->CSR & (RCC_CSR_PINRSTF | RCC_CSR_PORRSTF |
                        RCC_CSR_SFTRSTF | RCC_CSR_IWDGRSTF |
                        RCC_CSR_WWDGRSTF | RCC_CSR_LPWRRSTF);

     // リセットステータスの取得
     if (ulSts & RCC_CSR_SFTRSTF){
     	// ソフトウェアリセット時処理
     }

     if(ulSts & RCC_CSR_IWDGRSTF){
     	// IWDGリセット時処理 (LEDを消灯)
    	 HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
     }

     if(ulSts & RCC_CSR_WWDGRSTF){
          // WWDGリセット時処理
     }

     if(ulSts & RCC_CSR_PORRSTF){
     	// POR/PDRリセット時処理
     }

     if(ulSts & RCC_CSR_PINRSTF){
	//ピンリセット時処理
     }
     if(ulSts & RCC_CSR_LPWRRSTF){
	// 低電力リセット時処理
     }

     // リセットステータスのクリア
     RCC->CSR |= RCC_CSR_RMVF;
}
/* USER CODE END 4 */

 

これを動作させると、最初の2秒は点灯するが、

それ以降は、一瞬LEDが付くが、LEDがすぐ消灯するようになる。

また、ブレークを行い、CSRレジスタを確認すると以下のようになる。

(IWDGを使っているからか、不安定だった)

 

ここでは、IWDGのみ確認したが、以上の方法でリセットが発生した時の確認処理を追加できる。

 
 

3.関連記事

関連記事一覧:
 
組み込みC言語