Example #1
0
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();
	}
}
Example #2
0
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();
}
Example #3
0
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;
}
Example #4
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);
}