編集履歴一覧に戻る
Pinus0079のアイコン画像

Pinus0079 が 2021年07月27日22時11分53秒 に編集

コメント無し

本文の変更

概要 ==== 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を使います。 ![キャプションを入力できます](https://camo.elchika.com/d418c66f79ecbbc9142042d5ac4b401870dbd062/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61366264353061362d623532322d343934322d383235612d6430323435393539653030312f64383862346637642d636437392d343065382d383665612d363637393564343536373363/) また動作の確認用にUARTとオンボードのLEDを使うため、USART2を有効化しPA5ポートを出力設定としました。 コード ==== whileループ処理の前にSTANDBYモードから復帰したかどうか確認します。STANDBYモード復帰のフラグは__HAL_PWR_GET_FLAG(PWR_FLAG_SB)で確認することが出来ます。 もし復帰したことを確認したらUARTでその通知が送られ、NUCLEOボードのLEDが10回素早く点灯します。 ![キャプションを入力できます](https://camo.elchika.com/1d43bbe0d924460d0f364de4078fd87e160cd939/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61366264353061362d623532322d343934322d383235612d6430323435393539653030312f38303561663137352d646331312d343663342d616463302d643339356665393861656536/) ```C: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モードに入ります。 ![キャプションを入力できます](https://camo.elchika.com/551210fada0f0a934febeaeafa6944fa3bd829ea/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61366264353061362d623532322d343934322d383235612d6430323435393539653030312f66376264323062322d313438322d343938312d626166622d393534663863363538613962/) ```C: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