Pinus0079のアイコン画像

STM32 HALでのSTANDBYモードのやり方

Pinus0079 2021年07月27日に作成  (2021年07月27日に更新)

概要

STM32 HALのSTANDBYモードに関しての日本語記事が少ないのでまとめました。

STANDBYモードとはSTM32にいくつかある省電力モードの1つで、I/O制御が可能な最低電力モードです。(SHUTDOWNモードが最も省電力)

詳細は以下のサイトを参考にして下さい。

https://www.stmcu.jp/wp/wp-content/uploads/files/presentation-ja/STM32WB/12_STM32WB-System-Power-control-(PWR)_J.pdf

今回私が使用したのはSTM32F446RET搭載のNUCLEO-F446REです。NUCLEOボードにはUSER Buttonがありますが、ちょうどこのスイッチが接続されているポートを、STANDBYモードからのウェイクアップ入力として利用できるので使います。

設定

STM32F446RETではPA0ポートとPC13ポートをウェイクアップ入力として利用できます。今回はUSER Buttonが接続されている、PC13ポートのWake-Up 1を使います。

キャプションを入力できます

また動作の確認用にUARTとオンボードのLEDを使うため、USART2を有効化しPA5ポートを出力設定としました。

コード

whileループ処理の前にSTANDBYモードから復帰したかどうか確認します。STANDBYモード復帰のフラグは__HAL_PWR_GET_FLAG(PWR_FLAG_SB)で確認することが出来ます。
もし復帰したことを確認したらUARTでその通知が送られ、NUCLEOボードのLEDが10回素早く点灯します。
キャプションを入力できます

STANDBYモードからの復帰の確認

//Check if the SB flag is set if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // clear the flag //display the string char *str = "Wakeup from the STANDBY MODE\n"; HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELAY); //Blink the LED for(int i = 0; i < 20; i++){ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(50); } //Disable the WAKEUP PIN HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); //disable PA0 HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN2); //disable PC13 HAL_Delay(500); }

以下がSTANDBYモードに移行するためのコードです。STANDBYモードに移行するまでは、LEDが点灯し続けます。またSTANDBYモードに入るときは必ずウェイクアップピンを有効にして下さい。
USER Buttonを押すことでSTANDBYモードに入ります。
キャプションを入力できます

STANDBYモードに移行

while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(200); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //When the B1 button is pushed, enter the standby mode if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) { //Now enter the standby mode //Clear the WU FLAG __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //Enable the WAKEUP PIN HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2); //display the string char *str = "STANDBY MODE is ON\n\n"; HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELAY); HAL_Delay(500); //Enter the standby mode HAL_PWR_EnterSTANDBYMode(); } } /* USER CODE END 3 */

ここで注意なのが、USER Buttonは基板上でプルアップされています。したがってSTANDBYモード中は常に押し続ける必要があり、離すことでSTANDBYモードから復帰します。

またstringを使用してますので、string.hをインクルードして下さい。

参考文献

https://www.stmcu.jp/wp/wp-content/uploads/files/presentation-ja/STM32WB/12_STM32WB-System-Power-control-(PWR)_J.pdf

https://www.youtube.com/watch?v=TFkU3QD71Pc

1
Pinus0079のアイコン画像
Arduino、ESP32でよく工作しています。最近はSTM32に手を出し、HALライブラリを勉強中です。
ログインしてコメントを投稿する