/** * @brief This function configures the system to enter Standby mode for * current consumption measurement purpose. * STANDBY Mode * ============ * - RTC OFF * - IWDG and LSI OFF * - Wakeup using WakeUp Pin (wire Vdd to PA.00) * @retval None */ void StandbyMode_Measure(void) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); /* Allow access to Backup */ HAL_PWR_EnableBkUpAccess(); /* Reset RTC Domain */ __HAL_RCC_BACKUPRESET_FORCE(); __HAL_RCC_BACKUPRESET_RELEASE(); /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry mainly when using more than one wakeup source this is to not miss any wakeup event. - Disable all used wakeup sources, - Clear all related wakeup flags, - Re-enable all used wakeup sources, - Enter the Standby mode. */ /*#### Disable all used wakeup sources: WKUP pin ###########################*/ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /*#### Clear all related wakeup flags ######################################*/ /* Clear PWR wake up Flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Request to enter STANDBY mode */ HAL_PWR_EnterSTANDBYMode(); }
/** * @brief This function configures the system to enter Standby mode for * current consumption measurement purpose. * STANDBY Mode * ============ * - Backup SRAM and RTC OFF * - IWDG and LSI OFF * - Wakeup using WakeUp Pin (PA.00) * @param None * @retval None */ void StandbyMode_Measure(void) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); /* Allow access to Backup */ HAL_PWR_EnableBkUpAccess(); /* Reset RTC Domain */ __HAL_RCC_BACKUPRESET_FORCE(); __HAL_RCC_BACKUPRESET_RELEASE(); /* Disable all used wakeup sources: Pin1(PA.0) */ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /* Clear all related wakeup flags */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Re-enable all used wakeup sources: Pin1(PA.0) */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /*## Enter Standby Mode ####################################################*/ /* Request to enter STANDBY mode */ HAL_PWR_EnterSTANDBYMode(); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F0xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Low Level Initialization */ HAL_Init(); /* Configure LED1, LED2 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); /* Configure the system clock to 48 MHz */ SystemClock_Config(); /* Enable Power Clock */ __PWR_CLK_ENABLE(); /* Check if the system was resumed from StandBy mode */ if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) { /* Wait that user release the Tamper push-button */ BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_GPIO); while(BSP_PB_GetState(BUTTON_TAMPER) == GPIO_PIN_RESET){} } /* Initialize the Tamper push-button to generate external interrupts */ BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_EXTI); /* RTC configuration */ RTC_Config(); /* Turn on LED1 */ BSP_LED_On(LED1); /*The Following Wakeup sequence is highly recommended prior to each Standby mode entry mainly when using more than one wakeup source this is to not miss any wakeup event. - Disable all used wakeup sources, - Clear all related wakeup flags, - Re-enable all used wakeup sources, - Enter the Standby mode. */ /*Disable all used wakeup sources: Pin1(PA.0)*/ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /*Clear all related wakeup flags*/ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /*Re-enable all used wakeup sources: Pin1(PA.0)*/ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); while (1) { } }
/** * @brief This function configures the system to enter Standby mode with * backup SRAM ON for current consumption measurement purpose. * STANDBY Mode * ============ * - RTC OFF * - IWDG and LSI OFF * - Backup SRAM ON * - Wakeup using WakeUp Pin (PI.11) * @param None * @retval None */ void StandbyBKPSRAMMode_Measure(void) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); /* Allow access to Backup */ HAL_PWR_EnableBkUpAccess(); /* Reset RTC Domain */ __HAL_RCC_BACKUPRESET_FORCE(); __HAL_RCC_BACKUPRESET_RELEASE(); /* Disable all used wakeup sources: Pin6(PI.11) */ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN6); /* Clear all related wakeup flags */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Re-enable all used wakeup sources: Pin6(PI.11) */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN6); /* Enable BKPRAM Clock */ __HAL_RCC_BKPSRAM_CLK_ENABLE(); /* Enable the Backup SRAM low power Regulator */ HAL_PWREx_EnableBkUpReg(); /* Request to enter STANDBY mode */ HAL_PWR_EnterSTANDBYMode(); }
/** * @brief EXTI line detection callbacks * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == TAMPER_BUTTON_PIN) { /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry mainly when using more than one wakeup source this is to not miss any wakeup event: - Disable all used wakeup sources, - Clear all related wakeup flags, - Re-enable all used wakeup sources, - Enter the Standby mode. */ /*## Disable all used wakeup sources #####################################*/ /* Disable Wake-up timer */ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /*## Clear all related wakeup flags ######################################*/ /* Clear PWR wake up Flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /*## Re-enable all used wakeup sources ###################################*/ /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Turn LED1 off */ BSP_LED_Off(LED1); /*## Enter Standby Mode ##################################################*/ HAL_PWR_EnterSTANDBYMode(); } }
/** * @brief Low Power standby mode * NOTE: This is Low power standby mode with wakeup button(PA0) * After WAKEUP button interrupt the system will reset */ void BSP_StandbyMode_PB(void) { HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Clear standby and wakeup flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB | PWR_FLAG_WU); HAL_PWR_EnterSTANDBYMode(); }
/** * @brief EXTI line detection callbacks * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == KEY_BUTTON_PIN) { HAL_RTC_GetTime(&RTCHandle, &RTC_TimeStructure, RTC_FORMAT_BIN); HAL_RTC_GetDate(&RTCHandle, &RTC_DateStructure, RTC_FORMAT_BIN); /* Set the alarm to current time + 5s */ RTC_AlarmStructure.Alarm = RTC_ALARM_A; RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_TimeStructure.TimeFormat; RTC_AlarmStructure.AlarmTime.Hours = RTC_TimeStructure.Hours; RTC_AlarmStructure.AlarmTime.Minutes = RTC_TimeStructure.Minutes; RTC_AlarmStructure.AlarmTime.Seconds = (RTC_TimeStructure.Seconds + 0x05) % 60; RTC_AlarmStructure.AlarmDateWeekDay = 0x31; RTC_AlarmStructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES; RTC_AlarmStructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE; /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry mainly when using more than one wakeup source this is to not miss any wakeup event: - Disable all used wakeup sources, - Clear all related wakeup flags, - Re-enable all used wakeup sources, - Enter the Standby mode. */ /*## Disable all used wakeup sources #####################################*/ /* Disable Wake-up timer */ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /* Disable RTC Alarm */ HAL_RTC_DeactivateAlarm(&RTCHandle, RTC_ALARM_A); /*## Clear all related wakeup flags ######################################*/ /* Clear PWR wake up Flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Clear the Alarm Flag */ __HAL_RTC_ALARM_CLEAR_FLAG(&RTCHandle, RTC_FLAG_ALRAF); /*## Re-enable all used wakeup sources ###################################*/ /* Set RTC alarm */ if(HAL_RTC_SetAlarm_IT(&RTCHandle, &RTC_AlarmStructure, RTC_FORMAT_BIN) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Turn LED1 off */ BSP_LED_Off(LED1); /*## Enter Standby Mode ##################################################*/ HAL_PWR_EnterSTANDBYMode(); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F103xB HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 64 MHz */ SystemClock_Config(); /* Configure the system Power */ SystemPower_Config(); /* Check and handle if the system was resumed from Standby mode */ if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) { /* Clear Standby flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); } /* Insert 5 seconds delay */ HAL_Delay(5000); /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry mainly when using more than one wakeup source this is to not miss any wakeup event. - Disable all used wakeup sources, - Clear all related wakeup flags, - Re-enable all used wakeup sources, - Enter the Standby mode. */ /* Disable all used wakeup sources: PWR_WAKEUP_PIN1 */ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /* Clear all related wakeup flags*/ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Enable WakeUp Pin PWR_WAKEUP_PIN1 connected to PA.00 */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Enter the Standby mode */ HAL_PWR_EnterSTANDBYMode(); /* This code will never be reached! */ while (1) { } }
/** * @brief EXTI line detection callbacks * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == USER_BUTTON_PIN) { /* Wait that user release the User push-button */ while(BSP_PB_GetState(BUTTON_USER) == GPIO_PIN_SET){} HAL_RTC_GetTime(&RTCHandle, &RTC_TimeStructure, RTC_FORMAT_BIN); HAL_RTC_GetDate(&RTCHandle, &RTC_DateStructure, RTC_FORMAT_BIN); /* Set the alarm to current time + 5s */ RTC_AlarmStructure.Alarm = RTC_ALARM_A; RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_TimeStructure.TimeFormat; RTC_AlarmStructure.AlarmTime.Hours = RTC_TimeStructure.Hours; RTC_AlarmStructure.AlarmTime.Minutes = RTC_TimeStructure.Minutes; RTC_AlarmStructure.AlarmTime.Seconds = (RTC_TimeStructure.Seconds + 5) % 60; RTC_AlarmStructure.AlarmDateWeekDay = 31; RTC_AlarmStructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES; RTC_AlarmStructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE; if (HAL_RTC_SetAlarm_IT(&RTCHandle, &RTC_AlarmStructure, RTC_FORMAT_BIN) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry mainly when using more than one wakeup source this is to not miss any wakeup event. - Disable all used wakeup sources, - Clear all related wakeup flags, - Re-enable all used wakeup sources, - Enter the Standby mode. */ /*#### Disable all used wakeup sources: WKUP pin ###########################*/ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /*#### Clear all related wakeup flags ######################################*/ /* Clear PWR wake up Flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Turn LED3 off */ BSP_LED_Off(LED3); /* Request to enter STANDBY mode */ HAL_PWR_EnterSTANDBYMode(); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED1 and LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED3); /* Configure Key Button */ BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_EXTI); /* Configure Joystick using MFX in IT mode in order to wakeup system after standby */ BSP_JOY_Init(JOY_MODE_EXTI); /* RTC configuration */ RTC_Config(); /* Turn on LED1 */ BSP_LED_On(LED1); /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Infinite loop */ while (1) { if (AuthorizeToggle) { /* Toggle LED1 */ BSP_LED_Toggle(LED1); AuthorizeToggle = 0; } if (MfxExtiReceived) { /* Clear MFX IT */ BSP_IO_ITClear(); MfxExtiReceived = 0; } } }
/* State behaviour */ void behaviour_goodbye(state_ptr state) { uint32_t i; buzzer_note_t beep; /* Set events to react to */ /* Do state actions */ /* Blink green pin before shutting down */ HAL_GPIO_WritePin(GPIOC,UI_LED_R_Pin|UI_LED_B_Pin|UI_LED_G_Pin,GPIO_PIN_RESET); for (i = 0; i < 6; i++) { HAL_GPIO_TogglePin(GPIOC,UI_LED_G_Pin); osDelay(200); } /* Beep */ beep.note = A4; beep.ms = 100; while(osMailPut(queue_periph_buzzerHandle, (void *) &beep) != osOK) { osDelay(1); } osDelay(105); beep.note = D4; beep.ms = 80; while(osMailPut(queue_periph_buzzerHandle, (void *) &beep) != osOK) { osDelay(1); } osDelay(80); // Sleep well little prince /* Turn off LED */ HAL_GPIO_WritePin(GPIOC,UI_LED_R_Pin|UI_LED_B_Pin|UI_LED_G_Pin,GPIO_PIN_RESET); /* Disable RTC alarms to avoid waking the system up */ __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc); __HAL_RTC_ALARMA_DISABLE(&hrtc); /* Enable wakeup pin and go to sleep */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); HAL_PWR_EnterSTANDBYMode(); }
void StandbyMode(void) { MX_GPIO_Deinit(); /* This procedure come from the STM32F030 Errata sheet*/ __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /* Clear PWR wake up Flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Enter STANDBY mode */ HAL_PWR_EnterSTANDBYMode(); }
/** * @brief EXTI line detection callbacks * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == TAMPER_BUTTON_PIN) { HAL_RTC_GetTime(&RTCHandle, &RTC_TimeStructure, RTC_FORMAT_BIN); HAL_RTC_GetDate(&RTCHandle, &RTC_DateStructure, RTC_FORMAT_BIN); /* Set the alarm to current time + 5s */ RTC_AlarmStructure.Alarm = RTC_ALARM_A; RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_TimeStructure.TimeFormat; RTC_AlarmStructure.AlarmTime.Hours = RTC_TimeStructure.Hours; RTC_AlarmStructure.AlarmTime.Minutes = RTC_TimeStructure.Minutes; RTC_AlarmStructure.AlarmTime.Seconds = (RTC_TimeStructure.Seconds + 5) % 60; RTC_AlarmStructure.AlarmDateWeekDay = 31; RTC_AlarmStructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES; RTC_AlarmStructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE; if (HAL_RTC_SetAlarm_IT(&RTCHandle, &RTC_AlarmStructure, RTC_FORMAT_BIN) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Wait that user release the Tamper push-button */ while(BSP_PB_GetState(BUTTON_TAMPER) == GPIO_PIN_SET){} /* Disable all used wakeup sources: WKUP pin */ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN4); /* Clear all related wakeup flags */ /* Clear PWR wake up Flag */ __HAL_PWR_CLEAR_WAKEUP_FLAG(PWR_WAKEUP_PIN_FLAG4); /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN4); /* Turn on LED1 */ BSP_LED_Off(LED1); /* Request to enter STANDBY mode */ HAL_PWR_EnterSTANDBYMode(); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure LED1, LED2 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); /* Configure the system clock to 168 MHz */ SystemClock_Config(); /* Enable Power Clock */ __HAL_RCC_PWR_CLK_ENABLE(); /* Check and Clear the Wakeup flag */ if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); } /* Initialize the Key push-button to generate external interrupts */ BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI); /* RTC configuration */ RTC_Config(); /* Turn on LED1 */ BSP_LED_On(LED1); /* Enable WakeUp Pin PWR_WAKEUP_PIN1 connected to PA.00 */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); while (1) { } }
/** * @brief This function handles TIM6 global interrupt. */ void TIM6_IRQHandler(void) { /* USER CODE BEGIN TIM6_IRQn 0 */ /* Turn off LED */ HAL_GPIO_WritePin(GPIOC,UI_LED_R_Pin|UI_LED_B_Pin|UI_LED_G_Pin,GPIO_PIN_RESET); /* Disable RTC alarms because they wake the system up */ HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn); /* USER CODE END TIM6_IRQn 0 */ HAL_TIM_IRQHandler(&htim6); /* USER CODE BEGIN TIM6_IRQn 1 */ /* Set wake up pin and go to sleep (little prince) */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); HAL_PWR_EnterSTANDBYMode(); /* USER CODE END TIM6_IRQn 1 */ }
/** * @brief Run the Lowpower Standby mode Wakeup pin * @param None. * @note run and display information about the lowpower feature. * @retval None. */ void LowPowerStandbyWakeupPin(void) { kWindow_Popup("STANDBY WAKEUP", LCD_COLOR_WHITE, LCD_COLOR_BLUE,\ "JOY sel will\nstart\nstandby mode\n", \ LCD_COLOR_WHITE, LCD_COLOR_BLUE ); HAL_Delay(100); user_event = JOY_UP; while(user_event != JOY_SEL) { user_action = 0; }; kWindow_Popup("", LCD_COLOR_WHITE, LCD_COLOR_WHITE, \ "\n\n\n\npress JOY SEL\nto exit\nand reset\n",\ LCD_COLOR_BLUE, LCD_COLOR_WHITE ); /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /*#### Enter StandBy mode ####*/ HAL_PWR_EnterSTANDBYMode(); }
/* StartDefaultTask function */ void StartDefaultTask(void const * argument) { int i = 1; /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for(;;) { if ((i % 64) == 0) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); while((PWR->CSR & (uint32_t) 0x00000001)!=0);//attesa che il WUF si azzeri (via HW) HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 16384, RTC_WAKEUPCLOCK_RTCCLK_DIV16); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_EnterSTANDBYMode(); } HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); osDelay(100); i++; } /* USER CODE END StartDefaultTask */ }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED1, LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED3); /* Configure Key Button */ BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_EXTI); /* Turn on LED1 */ BSP_LED_On(LED1); /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Infinite loop */ while (1) { if (AuthorizeToggle) { /* Toggle LED1 */ BSP_LED_Toggle(LED1); AuthorizeToggle = 0; } } }
/* State behaviour */ void behaviour_goodbye(state_ptr state) { /* Set events to react to */ /* Do state actions */ /* Set menu */ osMutexWait(mutex_menuHandle, osWaitForever); menu_copy(&menu_goodbye, ¤t_menu); osMutexRelease(mutex_menuHandle); /* Display menu */ uint32_t i; for (i = 0; i < menu_goodbye.item_num; i++) { while (osMailPut(queue_lcdHandle, (void *) &menu_goodbye.items[i]) != osOK) { osDelay(1); } } /* Do state actions */ osDelay(2000); // Sleep well little prince /* Turn off LED */ HAL_GPIO_WritePin(GPIOC,UI_LED_R_Pin|UI_LED_B_Pin|UI_LED_G_Pin,GPIO_PIN_RESET); /* Disable RTC alarms to avoid waking the system up */ __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc); __HAL_RTC_ALARMA_DISABLE(&hrtc); /* Enable wakeup pin and go to sleep */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); HAL_PWR_EnterSTANDBYMode(); }
/** * @brief EXTI line detection callbacks * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == TAMPER_BUTTON_PIN) { HAL_RTC_GetTime(&RTCHandle, &RTC_TimeStructure, RTC_FORMAT_BIN); HAL_RTC_GetDate(&RTCHandle, &RTC_DateStructure, RTC_FORMAT_BIN); /* Set the alarm to current time + 5s */ RTC_AlarmStructure.Alarm = RTC_ALARM_A; RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_TimeStructure.TimeFormat; RTC_AlarmStructure.AlarmTime.Hours = RTC_TimeStructure.Hours; RTC_AlarmStructure.AlarmTime.Minutes = RTC_TimeStructure.Minutes; RTC_AlarmStructure.AlarmTime.Seconds = (RTC_TimeStructure.Seconds + 0x05) % 60; RTC_AlarmStructure.AlarmDateWeekDay = 0x31; RTC_AlarmStructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES; RTC_AlarmStructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE; /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry mainly when using more than one wakeup source this is to not miss any wakeup event: - Disable all used wakeup sources, - Clear all related wakeup flags, - Re-enable all used wakeup sources, - Enter the Standby mode. */ /*## Disable all used wakeup sources #####################################*/ /* Disable Wake-up timer */ HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); /* Disable RTC Alarm */ HAL_RTC_DeactivateAlarm(&RTCHandle, RTC_ALARM_A); /*## Clear all related wakeup flags ######################################*/ /* Clear PWR wake up Flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* Clear the Alarm Flag */ __HAL_RTC_ALARM_CLEAR_FLAG(&RTCHandle, RTC_FLAG_ALRAF); /*## Re-enable all used wakeup sources ###################################*/ /* Set RTC alarm */ if(HAL_RTC_SetAlarm_IT(&RTCHandle, &RTC_AlarmStructure, RTC_FORMAT_BIN) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Enable WKUP pin */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* Turn LED1 off */ BSP_LED_Off(LED1); /*## Enter Standby Mode ##################################################*/ HAL_PWR_EnterSTANDBYMode(); } if(GPIO_Pin == MFX_IRQOUT_PIN) { /* The different functionalities of MFX (TS, Joystick, SD detection, etc. ) can be configured in exti mode to generate an IRQ on given events. The MFX IRQ_OUT pin is unique and common to all functionalities, so if several functionalities are configured in exit mode, the MCU has to enquire MFX about the IRQ source (see BSP_IO_ITGetStatus). Communication with Mfx is done by I2C. Often the sw requires ISRs (irq service routines) to be quick while communication with I2C can be considered relatively long (hundreds of usec depending on I2C clk). Considering that the features for human interaction like TS, Joystick, SD detection don’t need immediate reaction, it is suggested to use POLLING instead of EXTI mode, in order to avoid "blocking I2C communication" on interrupt service routines */ /* Here an example of implementation is proposed: mix between pooling and exit: On ISR a flag is set (MfxIrqReceived), the main loop polls on the flag; Mcu communicates with Mfx only when the flag has been set. This is just an example: the users should choose they strategy depending on their application needs.*/ MfxExtiReceived = 1; } }