/** * @brief Enter the MCU selected low power modes. * @param lpmode: selected MCU low power modes. This parameter can be one of the * following values: * @arg STM32L_RUN: Run mode at 32MHz. * @arg STM32L_RUN_1M: Run mode at 1MHz. * @arg STM32L_RUN_LP: Low power Run mode at 32KHz. * @arg STM32L_SLEEP: Sleep mode at 16MHz. * @arg STM32L_SLEEP_LP: Low power Sleep mode at 32KHz. * @arg STM32L_STOP: Stop mode with or without RTC. * @arg STM32L_STANDBY: Standby mode with or without RTC. * @param RTCState: RTC peripheral state during low power modes. This parameter * is valid only for STM32L_RUN_LP, STM32L_SLEEP_LP, STM32L_STOP and * STM32L_STANDBY. This parameter can be one of the following values: * @arg RTC_STATE_ON: RTC peripheral is ON during low power modes. * @arg RTC_STATE_OFF: RTC peripheral is OFF during low power modes. * @param CalibrationState: Bias Calibration mode selection state during low * power modes. * This parameter can be one of the following values: * @arg BIAS_CALIB_OFF: Bias Calibration mode is selected during * low power modes. * @arg BIAS_CALIB_ON: Bias Calibration mode isn't selected during * low power modes. * @retval None */ void IDD_Measurement(uint32_t lpmode, uint8_t RTCState, uint8_t CalibrationState) { GPIO_InitTypeDef GPIO_InitStructure; uint16_t mode = STM32L_MODE_LP, adcdata, i; /* Disable the Wakeup Interrupt */ RTC_ITConfig(RTC_IT_WUT, DISABLE); /* Disable the JoyStick interrupts */ Demo_IntExtOnOffConfig(DISABLE); /* Disable Leds toggling */ Demo_LedShow(DISABLE); /* Save the RCC configuration */ RCC_AHBENR = RCC->AHBENR; RCC_APB2ENR = RCC->APB2ENR; RCC_APB1ENR = RCC->APB1ENR; /* Disable PVD */ PWR_PVDCmd(DISABLE); /* Wait until JoyStick is pressed */ while (Menu_ReadKey() != NOKEY) {} /* Save the GPIO pins current configuration then put all GPIO pins in Analog Input mode ...*/ IDD_Measurement_SaveContext(); /* Clear Wake Up flag */ PWR_ClearFlag(PWR_FLAG_WU); RCC->AHBENR = 0x05; RCC->APB2ENR = 0x00; RCC->APB1ENR = 0x10000000; /* PWR APB1 Clock enable */ switch(lpmode) { /*=========================================================================* * RUN MODE 32MHz (HSE + PLL) * *========================================================================*/ case STM32L_RUN: { mode = STM32L_MODE_RUN; /* Needed delay to have a correct value on capacitor C25. Running NOP during waiting loop will decrease the current consumption. */ for (i = 0;i < 0xFFFF; i++) { __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } } break; /*=========================================================================* * RUN MODE MSI 1MHz * *========================================================================*/ case STM32L_RUN_1M: { mode = STM32L_MODE_RUN; /* Reconfigure the System Clock at MSI 1 MHz */ SetHCLKToMSI_1MHz(); /* Needed delay to have a correct value on capacitor C25. Running NOP during waiting loop will decrease the current consumption. */ for (i = 0;i < 0x3FFF; i++) { __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } } break; /*=========================================================================* * RUN LOW POWER MODE MSI 32KHz * *========================================================================*/ case STM32L_RUN_LP: { if(!RTCState) { RCC_LSEConfig(RCC_LSE_OFF); } else { if (RTC_GetFlagStatus(RTC_FLAG_INITS) == RESET) { /* RTC Configuration ************************************************/ /* Reset RTC Domain */ RCC_RTCResetCmd(ENABLE); RCC_RTCResetCmd(DISABLE); /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); } } /* Configure the System Clock at MSI 32 KHz */ SetHCLKToMSI_64KHz(); RCC_HCLKConfig(RCC_SYSCLK_Div2); /* Clear IDD_CNT_EN pin */ GPIO_ResetBits(IDD_CNT_EN_GPIO_PORT, IDD_CNT_EN_PIN); /* Enter low power run mode */ PWR_EnterLowPowerRunMode(ENABLE); /* Waiting wake-up interrupt */ /* Needed delay to have a correct value on capacitor C25. Running NOP during waiting loop will decrease the current consumption. */ do { __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); }while(LowPowerStatus == 0x00); /* Exit low power run mode before setting the clock to 32MHz */ PWR_EnterLowPowerRunMode(DISABLE); while(PWR_GetFlagStatus(PWR_FLAG_REGLP) != RESET) { } } break; /*=========================================================================* * SLEEP MODE HSI 16MHz * *========================================================================*/ case STM32L_SLEEP: { mode = STM32L_MODE_RUN; /* Enable Ultra low power mode */ PWR_UltraLowPowerCmd(ENABLE); /* Diable FLASH during SLeep LP */ FLASH_SLEEPPowerDownCmd(ENABLE); RCC_APB2PeriphClockLPModeCmd(RCC_APB2Periph_CLOCK, ENABLE); RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_CLOCK, ENABLE); RCC_AHBPeriphClockLPModeCmd(RCC_AHBPeriph_CLOCK, ENABLE); /* Configure the System Clock to 16MHz */ SetHCLKToHSI(); Demo_SysTickConfig(); Demo_Delay(5); /* Request to enter SLEEP mode with regulator on */ PWR_EnterSleepMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); } break; /*=========================================================================* * SLEEP LOW POWER MODE MSI 32KHz * *========================================================================*/ case STM32L_SLEEP_LP: { if(!RTCState) { RCC_LSEConfig(RCC_LSE_OFF); } else { if (RTC_GetFlagStatus(RTC_FLAG_INITS) == RESET) { /* RTC Configuration ************************************************/ /* Reset RTC Domain */ RCC_RTCResetCmd(ENABLE); RCC_RTCResetCmd(DISABLE); /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); } } /* Enable Ultra low power mode */ PWR_UltraLowPowerCmd(ENABLE); /* Diable FLASH during SLeep LP */ FLASH_SLEEPPowerDownCmd(ENABLE); /* Disable HSI clock before entering Sleep LP mode */ RCC_HSICmd(DISABLE); /* Disable HSE clock */ RCC_HSEConfig(RCC_HSE_OFF); /* Disable LSI clock */ RCC_LSICmd(DISABLE); RCC_APB2PeriphClockLPModeCmd(RCC_APB2Periph_CLOCK, ENABLE); RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_CLOCK, ENABLE); RCC_AHBPeriphClockLPModeCmd(RCC_AHBPeriph_CLOCK, ENABLE); /* Clear IDD_CNT_EN pin */ GPIO_ResetBits(IDD_CNT_EN_GPIO_PORT, IDD_CNT_EN_PIN); /* Reconfigure the System Clock at MSI 64 KHz */ SetHCLKToMSI_64KHz(); RCC_HCLKConfig(RCC_SYSCLK_Div2); /* Request to enter SLEEP mode with regulator low power */ PWR_EnterSleepMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); } break; /*=========================================================================* * STOP LOW POWER MODE * *========================================================================*/ case STM32L_STOP: { /* Enable Ultra low power mode */ PWR_UltraLowPowerCmd(ENABLE); if(!RTCState) { RCC_LSEConfig(RCC_LSE_OFF); } else { if (RTC_GetFlagStatus(RTC_FLAG_INITS) == RESET) { /* RTC Configuration ************************************************/ /* Reset RTC Domain */ RCC_RTCResetCmd(ENABLE); RCC_RTCResetCmd(DISABLE); /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); } } /* Clear IDD_CNT_EN pin */ GPIO_ResetBits(IDD_CNT_EN_GPIO_PORT, IDD_CNT_EN_PIN); /* Request to enter STOP mode with regulator in low power */ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); /* Reset the counter by programming IDD_CNT_EN High in less than 70ms after the wakeup to avoid 1Kohm to be connected later on VDD_MCU */ GPIO_SetBits(IDD_CNT_EN_GPIO_PORT, IDD_CNT_EN_PIN); /* Configures system clock after wake-up from STOP: enable HSE, PLL and select PLL as system clock source (HSE and PLL are disabled in STOP mode) */ IDD_Measurement_SYSCLKConfig_STOP(); } break; /*=========================================================================* * STANDBY LOW POWER MODE * *========================================================================*/ case STM32L_STANDBY: { if (RTC_GetFlagStatus(RTC_FLAG_INITS) == RESET) { /* RTC Configuration **************************************************/ /* Reset RTC Domain */ RCC_RTCResetCmd(ENABLE); RCC_RTCResetCmd(DISABLE); /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); } RTC_OutputTypeConfig(RTC_OutputType_PushPull); RTC_OutputConfig(RTC_Output_WakeUp, RTC_OutputPolarity_High); /* To configure PC13 WakeUP output */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource13, GPIO_AF_RTC_AF1); PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE); PWR_UltraLowPowerCmd(ENABLE); RTC_ClearFlag(RTC_FLAG_WUTF | RTC_FLAG_ALRBF | RTC_FLAG_ALRAF | RTC_FLAG_TAMP1F | RTC_FLAG_TSF); RTC_ITConfig(RTC_IT_WUT, DISABLE); if(!RTCState) { RCC_LSEConfig(RCC_LSE_OFF); } /* Clear Wake Up flag */ PWR_ClearFlag(PWR_FLAG_WU); /* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */ PWR_EnterSTANDBYMode(); } break; } /* Configure the System Clock to 32MHz */ SetHCLKTo32(); /* Reset lowpower status variable*/ LowPowerStatus = 0x00; RCC->AHBENR = RCC_AHBENR; RCC->APB2ENR = RCC_APB2ENR; RCC->APB1ENR = RCC_APB1ENR; /* Reset the counter by programming IDD_CNT_EN High in less than 70ms after the wakeup to avoid 1Kohm to be connected later on VDD_MCU */ GPIO_SetBits(IDD_CNT_EN_GPIO_PORT, IDD_CNT_EN_PIN); /* Measure the Voltage using the ADC */ adcdata = IDD_Measurement_ADC_ReadValue(); /* Write the ADC converted value in the DATA EEPROM memory for Bias Measurement */ if(CalibrationState == BIAS_CALIB_ON) { /* Unlock EEPROM write access*/ DATA_EEPROM_Unlock(); /* Store the value in EEPROM for application needs */ DATA_EEPROM_ProgramHalfWord(DATA_EEPROM_BIAS_ADDR, adcdata); /* Lock back EEPROM write access */ DATA_EEPROM_Lock(); } IDD_Measurement_ADC_DisplayValue(adcdata, mode); /* Clear Wake Up flag */ PWR_ClearFlag(PWR_FLAG_WU); /* Enable PVD */ PWR_PVDCmd(ENABLE); /* Restore Demonstration Context. */ IDD_Measurement_RestoreContext(); LCD_SetBackColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_6, "STM32L LowPower Mode"); LCD_DisplayStringLine(LCD_LINE_7, Str); LCD_DisplayStringLine(LCD_LINE_8, "Press JoyStick to "); LCD_DisplayStringLine(LCD_LINE_9, "continue. "); /* Wait until Joystick pressed. */ while (Menu_ReadKey() == NOKEY) {} /* Disable ADC1 */ ADC_Cmd(ADC1, DISABLE); LCD_Clear(LCD_COLOR_WHITE); LCD_GLASS_DisplayString(" STM32L "); /* Enable the Wakeup Interrupt */ RTC_ITConfig(RTC_IT_WUT, ENABLE); /* Enable the JoyStick interrupts */ Demo_IntExtOnOffConfig(ENABLE); /* Display the previous menu */ Menu_DisplayMenu(); }
/** * @brief RCR receiver demo exec. * @param None * @retval None */ void Menu_RC5Decode_Func(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* Disable the TIM15, LED Toggling */ TIM_Cmd(TIM15, DISABLE); /* Disable the JoyStick interrupt */ Demo_IntExtOnOffCmd(DISABLE); while (Menu_ReadKey() != NOKEY) {} /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); /* Display Image */ LCD_SetDisplayWindow(120, 192, 64, 64); Storage_OpenReadFile(120, 192, "STFILES/TV.BMP"); LCD_WindowModeDisable(); /* Set the LCD Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the LCD Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_9, " To exit press UP "); /* Initialize the InfraRed application: RC5 */ RFDemoStatus = RC5DEMO; RC5_Init(); while(Menu_ReadKey() != UP) { /* Decode the RC5 frame */ RC5_Decode(&RC5_FRAME); } LCD_Clear(LCD_COLOR_WHITE); TIM_DeInit(TIM2); /* Time Base configuration 100ms*/ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 1000; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0x0C80; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* Channel 1, 2, 3 and 4 Configuration in Timing mode */ TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0x0; TIM_OC1Init(TIM2, &TIM_OCInitStructure); Demo_LedShow(ENABLE); /* Exit the RF5 demo */ RFDemoStatus = 0; /* Enable the JoyStick interrupt */ Demo_IntExtOnOffCmd(ENABLE); /* Display menu */ Menu_DisplayMenu(); }
/** * @brief Restore Demonstration context (GPIOs Configurations, peripherals,...). * @param None * @retval None */ void IDD_Measurement_RestoreContext(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; GPIOA->MODER = GPIOA_MODER; GPIOB->MODER = GPIOB_MODER; GPIOC->MODER = GPIOC_MODER; GPIOD->MODER = GPIOD_MODER; GPIOE->MODER = GPIOE_MODER; GPIOH->MODER = GPIOH_MODER; GPIOA->PUPDR = GPIOA_PUPDR; GPIOB->PUPDR = GPIOB_PUPDR; GPIOC->PUPDR = GPIOC_PUPDR; GPIOD->PUPDR = GPIOD_PUPDR; GPIOE->PUPDR = GPIOE_PUPDR; GPIOH->PUPDR = GPIOH_PUPDR; /* At this stage the system has resumed from STOP mode ---------------------*/ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Line = IDD_WAKEUP_EXTI_LINE; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = DISABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the EXTI Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = IDD_WAKEUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); /* Configure IDD_CNT_EN pin as output push-pull ----------------------------*/ GPIO_InitStructure.GPIO_Pin = IDD_CNT_EN_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_Init(IDD_CNT_EN_GPIO_PORT, &GPIO_InitStructure); /* Allow access to the RTC */ PWR_RTCAccessCmd(ENABLE); /*!< LSE Enable */ RCC_LSEConfig(RCC_LSE_ON); /*!< Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /*!< LCD Clock Source Selection */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* LCD GLASS Initialization */ LCD_GLASS_Init(); /* GPIO Configuration */ Demo_GPIOConfig(); /* Interrupt Configuration */ Demo_InterruptConfig(); /* Configure the systick */ Demo_SysTickConfig(); /*------------------- Drivers Initialization -------------------------------*/ /* Initialize the LEDs toggling */ Demo_LedShowInit(); /* Initialize the LCD */ STM32L152_LCD_Init(); /* If HSE is not detected at program startup */ if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) { /* Generate NMI exception */ SCB->ICSR |= SCB_ICSR_NMIPENDSET; } /* Initialize Wave player application */ WavePlayer_Init(); /* Initialize the Thermometer application */ LM75_Init(); /* Enable Leds toggling */ Demo_LedShow(ENABLE); /* COMP2 Configuration */ Demo_COMPConfig(); /* Enable Leds toggling */ Demo_LedShow(ENABLE); Demo_SysTickConfig(); }