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.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
その他:
・CubeIDEの使い方(起動~デバック実行) - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary