低消費電力モードであるSleep / Stop / Standbyを試してみます。 |
|
1.1. 入力ポートの設定 PA0 をEXTI、PA7を入力ポートとして設定します。PA0はSleep / Stop Mode からのWakeup要因として使用します。 |
|
|
PA0をWakeup要因として使用するのでGPIO modeをExternal Event Mode with Rising edge trigger detectionに設定します。 |
2.1. Sleep Mode |
動作確認の為、文字列送信関数を作成しておきます。/* USER CODE BEGIN 0 */ void UsartTransmitStrings(UART_HandleTypeDef *huart, char *pMsg) { HAL_UART_Transmit_IT(huart, (uint8_t *)pMsg, strlen(pMsg)); while ((*huart).gState != HAL_UART_STATE_READY); } /* USER CODE END 0 */ HAL_PWR_EnterSLEEPMode実行前にHAL_SuspendTickを呼び出しTick Timerを停止しておきます。 停止しないとTick Timerの割込みでWakeUpしてしまうためです。 /* USER CODE BEGIN 3 */ if (HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin) == GPIO_PIN_RESET) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); sprintf(msg, "Enter Sleep Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); HAL_SuspendTick(); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFE); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); HAL_ResumeTick(); sprintf(msg, "Leave Sleep Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); } PA0を押下するとSleep ModeからWakeUpします。 |
2.2. Stop Mode Stop Modeになると、内部クロック(HSI / HSE / MSI)は停止されます。よってWakeUpさせるためにRTCが必要となります。 コーディング前にRTCを有効にし、LSIを選択します。 確認の為、MSOを有効にしておきます。 |
|
HAL_PWR_EnterSTOPModeでStop Modeに遷移します。 内部クロックが停止しているので、WakeUp後RCCを再初期化する必要があります。 /* USER CODE BEGIN 3 */ if (HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin) == GPIO_PIN_RESET) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); sprintf(msg, "Enter Stop Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFE); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); SystemClock_Config(); sprintf(msg, "Leave Stop Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); } |
2.3. Standby Mode 次にStandby Modeを試してみます。Standby中は内部クロックが停止するだけでなく、VCoreもOFFとなるため、RAMやレジスタが保持されません。 WakeUp後はリセットと同じ動作となります。 |
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); sprintf(msg, "Enter Standby Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnterSTANDBYMode(); 最後にmain関数全体を記します。 /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ char msg[64]; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); MX_RTC_Init(); /* USER CODE BEGIN 2 */ sprintf(msg, "Sleep/Stop/Standby Test %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if (HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin) == GPIO_PIN_RESET) { #if 1 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); sprintf(msg, "Enter Sleep Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); HAL_SuspendTick(); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); HAL_ResumeTick(); sprintf(msg, "Leave Sleep Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); #endif #if 0 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); sprintf(msg, "Enter Stop Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFE); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); SystemClock_Config(); sprintf(msg, "Leave Stop Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); #endif #if 0 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); sprintf(msg, "Enter Standby Mode %08lX\r\n", PWR->CSR); UsartTransmitStrings(&huart2, msg); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnterSTANDBYMode(); #endif } } /* USER CODE END 3 */ } Standby Modeだけならわかりますが、Sleep / Stop Mode も同じなのは何故? |
|