Test of the Nucleo boards standby mode. sleep() and deepsleep() use the STM32 SLEEP and STOP modes. This uses the 3rd low power mode STANDBY. Utilises the WakeUp code here: https://developer.mbed.org/users/Sissors/code/WakeUp/ Adds a ClearWakeUp so that Standby can be entered repeatedly.
Diff: main.cpp
- Revision:
- 0:1ecaa40f74d0
- Child:
- 1:085a87258f10
diff -r 000000000000 -r 1ecaa40f74d0 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat May 07 11:51:56 2016 +0000 @@ -0,0 +1,143 @@ +// Depending on the LED connections either the LED is off the 2 seconds +// the target spends in deepsleep(), and on for the other second. Or it is inverted + + +#include "mbed.h" +#include "WakeUp.h" +#include "stm32f0xx_hal.h" +#include "stm32f0xx_hal_rtc_ex.h" +#include "rtc_wakeup.h" + +#define RTC_CR_WUTE (1<<10) +#define RTC_CR_WUTIE (1<<14) +#define EXTI_IMR_MR20 0x00100000 + + +DigitalOut myled(LED1); +DigitalOut Buzz(A2); +DigitalOut RST(D0); + +static RTC_HandleTypeDef RtcHandle; + +void ClearWakeUp(void); + +int main() +{ + ClearWakeUp(); + RST = 1; + Buzz = 0; + myled = 1; + wait(0.2); + myled = 0; + wait(0.2); + //print("Wake %i\r\n", TM_LOWPOWER_StandbyReset() ); + //The low-power oscillator can be quite inaccurate on some targets + //this function calibrates it against the main clock + WakeUp::calibrate(); + + + + //RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); //Need write access to DBP bit + + //__HAL_RCC_PWR_CLK_ENABLE(); + //PWR->CR |= PWR_CR_DBP; + //SET_BIT(PWR->CR, PWR_CR_DBP); + /* //Wait for Backup domain Write protection disable + uint32_t tickstart = HAL_GetTick(); + + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + */ + /* + HAL_PWR_EnableBkUpAccess(); + + RtcHandle.Instance = RTC; + __HAL_RTC_WRITEPROTECTION_DISABLE(&RtcHandle); + + __HAL_RTC_ALARM_EXTI_CLEAR_FLAG(); + __HAL_RTC_ALARM_CLEAR_FLAG(&RtcHandle, RTC_FLAG_ALRAF); + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RtcHandle, RTC_FLAG_WUTF); + //__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() ; + + // __HAL_RCC_BACKUPRESET_FORCE(); + //__HAL_RCC_BACKUPRESET_FORCE(); + + __HAL_RTC_WRITEPROTECTION_ENABLE(&RtcHandle); + + */ + + ///Direct register access version *************************************************** + + // ClearWakeUp(); + + //RCC_APB1PeriphCmd(RCC_APB1Periph_PWR, ENABLE); + + // __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); + //From Below works *************************************************** + + WakeUp::set_ms(2000); + + //Enter deepsleep, the program won't go beyond this point until it is woken up + //deepsleep(); + + printf("Standby Mode\r\n"); + + ClearWakeUp(); + + HAL_PWR_EnterSTANDBYMode(); + + //This will never be executed + printf("After sleep\r\n"); +} +void ClearWakeUp(void){ + PWR->CR |= PWR_CR_DBP; //Enable power domain + RTC->WPR = 0xCA; //Disable RTC write protection + RTC->WPR = 0x53; + + __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); + __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); + + RTC->WPR = 0xFF; //Enable RTC write protection + PWR->CR &= ~PWR_CR_DBP; //Disable power domain +} + +void ClearWakeUp2(void) +{ + ///Direct register access version *************************************************** + RtcHandle.Instance = RTC; + + __HAL_RTC_WAKEUPTIMER_DISABLE(&RtcHandle); + __HAL_RTC_WAKEUPTIMER_DISABLE_IT(&RtcHandle,RTC_IT_WUT); + + PWR->CR |= PWR_CR_DBP; //Enable power domain //******************* + RTC->WPR = 0xCA; //Disable RTC write protection + RTC->WPR = 0x53; + + __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT() ; + __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_EVENT() ; + + /* Disable the Alarm A interrupt */ + __HAL_RTC_ALARMA_DISABLE(&RtcHandle); + + /* Clear flag alarm A */ + __HAL_RTC_ALARM_CLEAR_FLAG(&RtcHandle, RTC_FLAG_ALRAF); + + __HAL_RTC_ALARM_EXTI_CLEAR_FLAG(); + __HAL_RTC_ALARM_CLEAR_FLAG(&RtcHandle, RTC_FLAG_ALRAF); + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RtcHandle, RTC_FLAG_WUTF); + + // #define __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() (EXTI->PR = RTC_EXTI_LINE_WAKEUPTIMER_EVENT) + __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() ; + + EXTI->PR = RTC_EXTI_LINE_WAKEUPTIMER_EVENT ; + EXTI->PR = 0x007FFFFF; + RTC->WPR = 0xFF; //Enable RTC write protection + PWR->CR &= ~PWR_CR_DBP; //Disable power domain + +} \ No newline at end of file