void HAL_Core_Enter_Stop_Mode(uint16_t wakeUpPin, uint16_t edgeTriggerMode, long seconds) { if (seconds > 0) { HAL_RTC_Cancel_UnixAlarm(); HAL_RTC_Set_UnixAlarm((time_t) seconds); } if ((wakeUpPin < TOTAL_PINS) && (edgeTriggerMode <= FALLING)) { uint16_t BKP_DR9_Data = wakeUpPin;//set wakeup pin mumber BKP_DR9_Data |= (edgeTriggerMode << 8);//set edge trigger mode BKP_DR9_Data |= (0xA << 12);//set stop mode flag /*************************************************/ //BKP_DR9_Data: 0xAXXX // |||| // ||----- octet wakeUpPin number // |------ nibble edgeTriggerMode // ------- nibble stop mode flag /*************************************************/ /* Execute Stop mode on next system reset */ BKP_WriteBackupRegister(BKP_DR9, BKP_DR9_Data); /* Reset System */ NVIC_SystemReset(); } }
void HAL_Core_Enter_Standby_Mode(uint32_t seconds, void* reserved) { // Configure RTC wake-up if (seconds > 0) { HAL_RTC_Cancel_UnixAlarm(); HAL_RTC_Set_UnixAlarm((time_t) seconds); } /* Execute Standby mode on next system reset */ BKP_WriteBackupRegister(BKP_DR9, 0xA5A5); /* Reset System */ NVIC_SystemReset(); }
int HAL_Core_Enter_Standby_Mode(uint32_t seconds, uint32_t flags) { // Configure RTC wake-up if (seconds > 0) { HAL_RTC_Cancel_UnixAlarm(); HAL_RTC_Set_UnixAlarm((time_t) seconds); } /* Execute Standby mode on next system reset */ BKP_WriteBackupRegister(BKP_DR9, 0xA5A5); /* Reset System */ NVIC_SystemReset(); // This will never get reached return 0; }
void HAL_Core_Execute_Stop_Mode(void) { int32_t state = HAL_disable_irq(); if((BKP_ReadBackupRegister(BKP_DR9) >> 12) == 0xA) { uint16_t wakeUpPin = BKP_ReadBackupRegister(BKP_DR9) & 0xFF; InterruptMode edgeTriggerMode = (InterruptMode)((BKP_ReadBackupRegister(BKP_DR9) >> 8) & 0x0F); /* Clear Stop mode system flag */ BKP_WriteBackupRegister(BKP_DR9, 0xFFFF); if ((wakeUpPin < TOTAL_PINS) && (edgeTriggerMode <= FALLING)) { PinMode wakeUpPinMode = INPUT; /* Set required pinMode based on edgeTriggerMode */ switch(edgeTriggerMode) { case CHANGE: wakeUpPinMode = INPUT; break; case RISING: wakeUpPinMode = INPUT_PULLDOWN; break; case FALLING: wakeUpPinMode = INPUT_PULLUP; break; } HAL_Pin_Mode(wakeUpPin, wakeUpPinMode); /* Configure EXTI Interrupt : wake-up from stop mode using pin interrupt */ HAL_Interrupts_Attach(wakeUpPin, NULL, NULL, edgeTriggerMode, NULL); /* Request to enter STOP mode with regulator in low power mode */ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); /* Detach the Interrupt pin */ HAL_Interrupts_Detach(wakeUpPin); /* Disable RTC Alarm */ HAL_RTC_Cancel_UnixAlarm(); /* At this stage the system has resumed from STOP mode */ /* Enable HSE, PLL and select PLL as system clock source after wake-up from STOP */ /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ if(RCC_WaitForHSEStartUp() != SUCCESS) { /* If HSE startup fails try to recover by system reset */ NVIC_SystemReset(); } /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08); } } HAL_enable_irq(state); }