Statistics
| Branch: | Tag: | Revision:

amiro-blt / Target / Modules / PowerManagement_1-1 / Boot / lib / stdperiphlib / STM32F4xx_StdPeriph_Driver / src / stm32f4xx_pwr.c @ 367c0652

History | View | Annotate | Download (25.8 KB)

1
/**
2
  ******************************************************************************
3
  * @file    stm32f4xx_pwr.c
4
  * @author  MCD Application Team
5
  * @version V1.1.0
6
  * @date    11-January-2013
7
  * @brief   This file provides firmware functions to manage the following 
8
  *          functionalities of the Power Controller (PWR) peripheral:           
9
  *           + Backup Domain Access
10
  *           + PVD configuration
11
  *           + WakeUp pin configuration
12
  *           + Main and Backup Regulators configuration
13
  *           + FLASH Power Down configuration
14
  *           + Low Power modes configuration
15
  *           + Flags management
16
  *               
17
  ******************************************************************************
18
  * @attention
19
  *
20
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
21
  *
22
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
23
  * You may not use this file except in compliance with the License.
24
  * You may obtain a copy of the License at:
25
  *
26
  *        http://www.st.com/software_license_agreement_liberty_v2
27
  *
28
  * Unless required by applicable law or agreed to in writing, software 
29
  * distributed under the License is distributed on an "AS IS" BASIS, 
30
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31
  * See the License for the specific language governing permissions and
32
  * limitations under the License.
33
  *
34
  ******************************************************************************
35
  */ 
36

    
37
/* Includes ------------------------------------------------------------------*/
38
#include "stm32f4xx_pwr.h"
39
#include "stm32f4xx_rcc.h"
40

    
41
/** @addtogroup STM32F4xx_StdPeriph_Driver
42
  * @{
43
  */
44

    
45
/** @defgroup PWR 
46
  * @brief PWR driver modules
47
  * @{
48
  */ 
49

    
50
/* Private typedef -----------------------------------------------------------*/
51
/* Private define ------------------------------------------------------------*/
52
/* --------- PWR registers bit address in the alias region ---------- */
53
#define PWR_OFFSET               (PWR_BASE - PERIPH_BASE)
54

    
55
/* --- CR Register ---*/
56

    
57
/* Alias word address of DBP bit */
58
#define CR_OFFSET                (PWR_OFFSET + 0x00)
59
#define DBP_BitNumber            0x08
60
#define CR_DBP_BB                (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4))
61

    
62
/* Alias word address of PVDE bit */
63
#define PVDE_BitNumber           0x04
64
#define CR_PVDE_BB               (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4))
65

    
66
/* Alias word address of FPDS bit */
67
#define FPDS_BitNumber           0x09
68
#define CR_FPDS_BB               (PERIPH_BB_BASE + (CR_OFFSET * 32) + (FPDS_BitNumber * 4))
69

    
70
/* Alias word address of PMODE bit */
71
#define PMODE_BitNumber           0x0E
72
#define CR_PMODE_BB               (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PMODE_BitNumber * 4))
73

    
74

    
75
/* --- CSR Register ---*/
76

    
77
/* Alias word address of EWUP bit */
78
#define CSR_OFFSET               (PWR_OFFSET + 0x04)
79
#define EWUP_BitNumber           0x08
80
#define CSR_EWUP_BB              (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4))
81

    
82
/* Alias word address of BRE bit */
83
#define BRE_BitNumber            0x09
84
#define CSR_BRE_BB              (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (BRE_BitNumber * 4))
85

    
86
/* ------------------ PWR registers bit mask ------------------------ */
87

    
88
/* CR register bit mask */
89
#define CR_DS_MASK               ((uint32_t)0xFFFFFFFC)
90
#define CR_PLS_MASK              ((uint32_t)0xFFFFFF1F)
91
#define CR_VOS_MASK              ((uint32_t)0xFFFF3FFF)
92

    
93
/* Private macro -------------------------------------------------------------*/
94
/* Private variables ---------------------------------------------------------*/
95
/* Private function prototypes -----------------------------------------------*/
96
/* Private functions ---------------------------------------------------------*/
97

    
98
/** @defgroup PWR_Private_Functions
99
  * @{
100
  */
101

    
102
/** @defgroup PWR_Group1 Backup Domain Access function 
103
 *  @brief   Backup Domain Access function  
104
 *
105
@verbatim   
106
 ===============================================================================
107
                  ##### Backup Domain Access function #####
108
 ===============================================================================  
109
    [..]
110
      After reset, the backup domain (RTC registers, RTC backup data 
111
      registers and backup SRAM) is protected against possible unwanted 
112
      write accesses. 
113
      To enable access to the RTC Domain and RTC registers, proceed as follows:
114
        (+) Enable the Power Controller (PWR) APB1 interface clock using the
115
            RCC_APB1PeriphClockCmd() function.
116
        (+) Enable access to RTC domain using the PWR_BackupAccessCmd() function.
117

118
@endverbatim
119
  * @{
120
  */
121

    
122
/**
123
  * @brief  Deinitializes the PWR peripheral registers to their default reset values.     
124
  * @param  None
125
  * @retval None
126
  */
127
void PWR_DeInit(void)
128
{
129
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
130
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE);
131
}
132

    
133
/**
134
  * @brief  Enables or disables access to the backup domain (RTC registers, RTC 
135
  *         backup data registers and backup SRAM).
136
  * @note   If the HSE divided by 2, 3, ..31 is used as the RTC clock, the 
137
  *         Backup Domain Access should be kept enabled.
138
  * @param  NewState: new state of the access to the backup domain.
139
  *          This parameter can be: ENABLE or DISABLE.
140
  * @retval None
141
  */
142
void PWR_BackupAccessCmd(FunctionalState NewState)
143
{
144
  /* Check the parameters */
145
  assert_param(IS_FUNCTIONAL_STATE(NewState));
146
  
147
  *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;
148
}
149

    
150
/**
151
  * @}
152
  */
153

    
154
/** @defgroup PWR_Group2 PVD configuration functions
155
 *  @brief   PVD configuration functions 
156
 *
157
@verbatim   
158
 ===============================================================================
159
                    ##### PVD configuration functions #####
160
 ===============================================================================  
161
    [..]
162
      (+) The PVD is used to monitor the VDD power supply by comparing it to a 
163
          threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR).
164
      (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower 
165
          than the PVD threshold. This event is internally connected to the EXTI 
166
          line16 and can generate an interrupt if enabled through the EXTI registers.
167
      (+) The PVD is stopped in Standby mode.
168

169
@endverbatim
170
  * @{
171
  */
172

    
173
/**
174
  * @brief  Configures the voltage threshold detected by the Power Voltage Detector(PVD).
175
  * @param  PWR_PVDLevel: specifies the PVD detection level
176
  *          This parameter can be one of the following values:
177
  *            @arg PWR_PVDLevel_0
178
  *            @arg PWR_PVDLevel_1
179
  *            @arg PWR_PVDLevel_2
180
  *            @arg PWR_PVDLevel_3
181
  *            @arg PWR_PVDLevel_4
182
  *            @arg PWR_PVDLevel_5
183
  *            @arg PWR_PVDLevel_6
184
  *            @arg PWR_PVDLevel_7
185
  * @note   Refer to the electrical characteristics of your device datasheet for
186
  *         more details about the voltage threshold corresponding to each 
187
  *         detection level.
188
  * @retval None
189
  */
190
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)
191
{
192
  uint32_t tmpreg = 0;
193
  
194
  /* Check the parameters */
195
  assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel));
196
  
197
  tmpreg = PWR->CR;
198
  
199
  /* Clear PLS[7:5] bits */
200
  tmpreg &= CR_PLS_MASK;
201
  
202
  /* Set PLS[7:5] bits according to PWR_PVDLevel value */
203
  tmpreg |= PWR_PVDLevel;
204
  
205
  /* Store the new value */
206
  PWR->CR = tmpreg;
207
}
208

    
209
/**
210
  * @brief  Enables or disables the Power Voltage Detector(PVD).
211
  * @param  NewState: new state of the PVD.
212
  *         This parameter can be: ENABLE or DISABLE.
213
  * @retval None
214
  */
215
void PWR_PVDCmd(FunctionalState NewState)
216
{
217
  /* Check the parameters */
218
  assert_param(IS_FUNCTIONAL_STATE(NewState));
219
  
220
  *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState;
221
}
222

    
223
/**
224
  * @}
225
  */
226

    
227
/** @defgroup PWR_Group3 WakeUp pin configuration functions
228
 *  @brief   WakeUp pin configuration functions 
229
 *
230
@verbatim   
231
 ===============================================================================
232
                 ##### WakeUp pin configuration functions #####
233
 ===============================================================================  
234
    [..]
235
      (+) WakeUp pin is used to wakeup the system from Standby mode. This pin is 
236
          forced in input pull down configuration and is active on rising edges.
237
      (+) There is only one WakeUp pin: WakeUp Pin 1 on PA.00.
238

239
@endverbatim
240
  * @{
241
  */
242

    
243
/**
244
  * @brief  Enables or disables the WakeUp Pin functionality.
245
  * @param  NewState: new state of the WakeUp Pin functionality.
246
  *         This parameter can be: ENABLE or DISABLE.
247
  * @retval None
248
  */
249
void PWR_WakeUpPinCmd(FunctionalState NewState)
250
{
251
  /* Check the parameters */  
252
  assert_param(IS_FUNCTIONAL_STATE(NewState));
253

    
254
  *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState;
255
}
256

    
257
/**
258
  * @}
259
  */
260

    
261
/** @defgroup PWR_Group4 Main and Backup Regulators configuration functions
262
 *  @brief   Main and Backup Regulators configuration functions 
263
 *
264
@verbatim   
265
 ===============================================================================
266
          ##### Main and Backup Regulators configuration functions #####
267
 ===============================================================================  
268
    [..]
269
      (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from 
270
          the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is 
271
          retained even in Standby or VBAT mode when the low power backup regulator
272
          is enabled. It can be considered as an internal EEPROM when VBAT is 
273
          always present. You can use the PWR_BackupRegulatorCmd() function to 
274
          enable the low power backup regulator and use the PWR_GetFlagStatus
275
          (PWR_FLAG_BRR) to check if it is ready or not. 
276

277
      (+) When the backup domain is supplied by VDD (analog switch connected to VDD) 
278
          the backup SRAM is powered from VDD which replaces the VBAT power supply to 
279
          save battery life.
280

281
      (+) The backup SRAM is not mass erased by an tamper event. It is read 
282
          protected to prevent confidential data, such as cryptographic private 
283
          key, from being accessed. The backup SRAM can be erased only through 
284
          the Flash interface when a protection level change from level 1 to 
285
          level 0 is requested. 
286
      -@- Refer to the description of Read protection (RDP) in the Flash 
287
          programming manual.
288

289
      (+) The main internal regulator can be configured to have a tradeoff between 
290
          performance and power consumption when the device does not operate at 
291
          the maximum frequency. This is done through PWR_MainRegulatorModeConfig() 
292
          function which configure VOS bit in PWR_CR register: 
293
        (++) When this bit is set (Regulator voltage output Scale 1 mode selected) 
294
             the System frequency can go up to 168 MHz. 
295
        (++) When this bit is reset (Regulator voltage output Scale 2 mode selected) 
296
             the System frequency can go up to 144 MHz.
297
              
298
        Refer to the datasheets for more details.
299
           
300
@endverbatim
301
  * @{
302
  */
303

    
304
/**
305
  * @brief  Enables or disables the Backup Regulator.
306
  * @param  NewState: new state of the Backup Regulator.
307
  *          This parameter can be: ENABLE or DISABLE.
308
  * @retval None
309
  */
310
void PWR_BackupRegulatorCmd(FunctionalState NewState)
311
{
312
  /* Check the parameters */
313
  assert_param(IS_FUNCTIONAL_STATE(NewState));
314

    
315
  *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)NewState;
316
}
317

    
318
/**
319
  * @brief  Configures the main internal regulator output voltage.
320
  * @param  PWR_Regulator_Voltage: specifies the regulator output voltage to achieve
321
  *         a tradeoff between performance and power consumption when the device does
322
  *         not operate at the maximum frequency (refer to the datasheets for more details).
323
  *          This parameter can be one of the following values:
324
  *            @arg PWR_Regulator_Voltage_Scale1: Regulator voltage output Scale 1 mode, 
325
  *                                                System frequency up to 168 MHz. 
326
  *            @arg PWR_Regulator_Voltage_Scale2: Regulator voltage output Scale 2 mode, 
327
  *                                                System frequency up to 144 MHz.    
328
  *            @arg PWR_Regulator_Voltage_Scale3: Regulator voltage output Scale 3 mode, 
329
  *                                                System frequency up to 120 MHz
330
  * @retval None
331
  */
332
void PWR_MainRegulatorModeConfig(uint32_t PWR_Regulator_Voltage)
333
{
334
        uint32_t tmpreg = 0;
335
        
336
  /* Check the parameters */
337
  assert_param(IS_PWR_REGULATOR_VOLTAGE(PWR_Regulator_Voltage));
338

    
339
  tmpreg = PWR->CR;
340
  
341
  /* Clear VOS[15:14] bits */
342
  tmpreg &= CR_VOS_MASK;
343
  
344
  /* Set VOS[15:14] bits according to PWR_Regulator_Voltage value */
345
  tmpreg |= PWR_Regulator_Voltage;
346
  
347
  /* Store the new value */
348
  PWR->CR = tmpreg;
349
}
350

    
351
/**
352
  * @}
353
  */
354

    
355
/** @defgroup PWR_Group5 FLASH Power Down configuration functions
356
 *  @brief   FLASH Power Down configuration functions 
357
 *
358
@verbatim   
359
 ===============================================================================
360
             ##### FLASH Power Down configuration functions #####
361
 ===============================================================================  
362
    [..]
363
      (+) By setting the FPDS bit in the PWR_CR register by using the 
364
          PWR_FlashPowerDownCmd() function, the Flash memory also enters power 
365
          down mode when the device enters Stop mode. When the Flash memory 
366
          is in power down mode, an additional startup delay is incurred when 
367
          waking up from Stop mode.
368
@endverbatim
369
  * @{
370
  */
371

    
372
/**
373
  * @brief  Enables or disables the Flash Power Down in STOP mode.
374
  * @param  NewState: new state of the Flash power mode.
375
  *          This parameter can be: ENABLE or DISABLE.
376
  * @retval None
377
  */
378
void PWR_FlashPowerDownCmd(FunctionalState NewState)
379
{
380
  /* Check the parameters */
381
  assert_param(IS_FUNCTIONAL_STATE(NewState));
382

    
383
  *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)NewState;
384
}
385

    
386
/**
387
  * @}
388
  */
389

    
390
/** @defgroup PWR_Group6 Low Power modes configuration functions
391
 *  @brief   Low Power modes configuration functions 
392
 *
393
@verbatim   
394
 ===============================================================================
395
              ##### Low Power modes configuration functions #####
396
 ===============================================================================  
397
    [..]
398
      The devices feature 3 low-power modes:
399
      (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running.
400
      (+) Stop mode: all clocks are stopped, regulator running, regulator 
401
          in low power mode
402
      (+) Standby mode: 1.2V domain powered off.
403
   
404
   *** Sleep mode ***
405
   ==================
406
    [..]
407
      (+) Entry:
408
        (++) The Sleep mode is entered by using the __WFI() or __WFE() functions.
409
      (+) Exit:
410
        (++) Any peripheral interrupt acknowledged by the nested vectored interrupt 
411
             controller (NVIC) can wake up the device from Sleep mode.
412

413
   *** Stop mode ***
414
   =================
415
    [..]
416
      In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI,
417
      and the HSE RC oscillators are disabled. Internal SRAM and register contents 
418
      are preserved.
419
      The voltage regulator can be configured either in normal or low-power mode.
420
      To minimize the consumption In Stop mode, FLASH can be powered off before 
421
      entering the Stop mode. It can be switched on again by software after exiting 
422
      the Stop mode using the PWR_FlashPowerDownCmd() function. 
423
   
424
      (+) Entry:
425
        (++) The Stop mode is entered using the PWR_EnterSTOPMode(PWR_Regulator_LowPower,) 
426
             function with regulator in LowPower or with Regulator ON.
427
      (+) Exit:
428
        (++) Any EXTI Line (Internal or External) configured in Interrupt/Event mode.
429
      
430
   *** Standby mode ***
431
   ====================
432
    [..]
433
      The Standby mode allows to achieve the lowest power consumption. It is based 
434
      on the Cortex-M4 deepsleep mode, with the voltage regulator disabled. 
435
      The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and 
436
      the HSE oscillator are also switched off. SRAM and register contents are lost 
437
      except for the RTC registers, RTC backup registers, backup SRAM and Standby 
438
      circuitry.
439
   
440
      The voltage regulator is OFF.
441
      
442
      (+) Entry:
443
        (++) The Standby mode is entered using the PWR_EnterSTANDBYMode() function.
444
      (+) Exit:
445
        (++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wakeup,
446
             tamper event, time-stamp event, external reset in NRST pin, IWDG reset.              
447

448
   *** Auto-wakeup (AWU) from low-power mode ***
449
   =============================================
450
    [..]
451
      The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC 
452
      Wakeup event, a tamper event, a time-stamp event, or a comparator event, 
453
      without depending on an external interrupt (Auto-wakeup mode).
454

455
      (#) RTC auto-wakeup (AWU) from the Stop mode
456
       
457
        (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to:
458
          (+++) Configure the EXTI Line 17 to be sensitive to rising edges (Interrupt 
459
                or Event modes) using the EXTI_Init() function.
460
          (+++) Enable the RTC Alarm Interrupt using the RTC_ITConfig() function
461
          (+++) Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() 
462
                and RTC_AlarmCmd() functions.
463
        (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it 
464
             is necessary to:
465
          (+++) Configure the EXTI Line 21 to be sensitive to rising edges (Interrupt 
466
                or Event modes) using the EXTI_Init() function.
467
          (+++) Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() 
468
                function
469
          (+++) Configure the RTC to detect the tamper or time stamp event using the
470
                RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd()
471
                functions.
472
        (++) To wake up from the Stop mode with an RTC WakeUp event, it is necessary to:
473
           (+++) Configure the EXTI Line 22 to be sensitive to rising edges (Interrupt 
474
                 or Event modes) using the EXTI_Init() function.
475
           (+++) Enable the RTC WakeUp Interrupt using the RTC_ITConfig() function
476
           (+++) Configure the RTC to generate the RTC WakeUp event using the RTC_WakeUpClockConfig(), 
477
                 RTC_SetWakeUpCounter() and RTC_WakeUpCmd() functions.
478

479
      (#) RTC auto-wakeup (AWU) from the Standby mode
480
   
481
        (++) To wake up from the Standby mode with an RTC alarm event, it is necessary to:
482
          (+++) Enable the RTC Alarm Interrupt using the RTC_ITConfig() function
483
          (+++) Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() 
484
                and RTC_AlarmCmd() functions.
485
        (++) To wake up from the Standby mode with an RTC Tamper or time stamp event, it 
486
             is necessary to:
487
          (+++) Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() 
488
                function
489
          (+++) Configure the RTC to detect the tamper or time stamp event using the
490
                RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd()
491
                functions.
492
        (++) To wake up from the Standby mode with an RTC WakeUp event, it is necessary to:
493
          (+++) Enable the RTC WakeUp Interrupt using the RTC_ITConfig() function
494
          (+++) Configure the RTC to generate the RTC WakeUp event using the RTC_WakeUpClockConfig(), 
495
                RTC_SetWakeUpCounter() and RTC_WakeUpCmd() functions.
496

497
@endverbatim
498
  * @{
499
  */
500

    
501
/**
502
  * @brief  Enters STOP mode.
503
  *   
504
  * @note   In Stop mode, all I/O pins keep the same state as in Run mode.
505
  * @note   When exiting Stop mode by issuing an interrupt or a wakeup event, 
506
  *         the HSI RC oscillator is selected as system clock.
507
  * @note   When the voltage regulator operates in low power mode, an additional 
508
  *         startup delay is incurred when waking up from Stop mode. 
509
  *         By keeping the internal regulator ON during Stop mode, the consumption 
510
  *         is higher although the startup time is reduced.           
511
  *     
512
  * @param  PWR_Regulator: specifies the regulator state in STOP mode.
513
  *          This parameter can be one of the following values:
514
  *            @arg PWR_Regulator_ON: STOP mode with regulator ON
515
  *            @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode
516
  * @param  PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction.
517
  *          This parameter can be one of the following values:
518
  *            @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction
519
  *            @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction
520
  * @retval None
521
  */
522
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
523
{
524
  uint32_t tmpreg = 0;
525
  
526
  /* Check the parameters */
527
  assert_param(IS_PWR_REGULATOR(PWR_Regulator));
528
  assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));
529
  
530
  /* Select the regulator state in STOP mode ---------------------------------*/
531
  tmpreg = PWR->CR;
532
  /* Clear PDDS and LPDSR bits */
533
  tmpreg &= CR_DS_MASK;
534
  
535
  /* Set LPDSR bit according to PWR_Regulator value */
536
  tmpreg |= PWR_Regulator;
537
  
538
  /* Store the new value */
539
  PWR->CR = tmpreg;
540
  
541
  /* Set SLEEPDEEP bit of Cortex System Control Register */
542
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
543
  
544
  /* Select STOP mode entry --------------------------------------------------*/
545
  if(PWR_STOPEntry == PWR_STOPEntry_WFI)
546
  {   
547
    /* Request Wait For Interrupt */
548
    __WFI();
549
  }
550
  else
551
  {
552
    /* Request Wait For Event */
553
    __WFE();
554
  }
555
  /* Reset SLEEPDEEP bit of Cortex System Control Register */
556
  SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);  
557
}
558

    
559
/**
560
  * @brief  Enters STANDBY mode.
561
  * @note   In Standby mode, all I/O pins are high impedance except for:
562
  *          - Reset pad (still available) 
563
  *          - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC 
564
  *            Alarm out, or RTC clock calibration out.
565
  *          - RTC_AF2 pin (PI8) if configured for tamper or time-stamp.  
566
  *          - WKUP pin 1 (PA0) if enabled.       
567
  * @param  None
568
  * @retval None
569
  */
570
void PWR_EnterSTANDBYMode(void)
571
{
572
  /* Clear Wakeup flag */
573
  PWR->CR |= PWR_CR_CWUF;
574
  
575
  /* Select STANDBY mode */
576
  PWR->CR |= PWR_CR_PDDS;
577
  
578
  /* Set SLEEPDEEP bit of Cortex System Control Register */
579
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
580
  
581
/* This option is used to ensure that store operations are completed */
582
#if defined ( __CC_ARM   )
583
  __force_stores();
584
#endif
585
  /* Request Wait For Interrupt */
586
  __WFI();
587
}
588

    
589
/**
590
  * @}
591
  */
592

    
593
/** @defgroup PWR_Group7 Flags management functions
594
 *  @brief   Flags management functions 
595
 *
596
@verbatim   
597
 ===============================================================================
598
                    ##### Flags management functions #####
599
 ===============================================================================  
600

601
@endverbatim
602
  * @{
603
  */
604

    
605
/**
606
  * @brief  Checks whether the specified PWR flag is set or not.
607
  * @param  PWR_FLAG: specifies the flag to check.
608
  *          This parameter can be one of the following values:
609
  *            @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event 
610
  *                  was received from the WKUP pin or from the RTC alarm (Alarm A 
611
  *                  or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup.
612
  *                  An additional wakeup event is detected if the WKUP pin is enabled 
613
  *                  (by setting the EWUP bit) when the WKUP pin level is already high.  
614
  *            @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was
615
  *                  resumed from StandBy mode.    
616
  *            @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled 
617
  *                  by the PWR_PVDCmd() function. The PVD is stopped by Standby mode 
618
  *                  For this reason, this bit is equal to 0 after Standby or reset
619
  *                  until the PVDE bit is set.
620
  *            @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset 
621
  *                  when the device wakes up from Standby mode or by a system reset 
622
  *                  or power reset.  
623
  *            @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage 
624
  *                 scaling output selection is ready. 
625
  * @retval The new state of PWR_FLAG (SET or RESET).
626
  */
627
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG)
628
{
629
  FlagStatus bitstatus = RESET;
630
  
631
  /* Check the parameters */
632
  assert_param(IS_PWR_GET_FLAG(PWR_FLAG));
633
  
634
  if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET)
635
  {
636
    bitstatus = SET;
637
  }
638
  else
639
  {
640
    bitstatus = RESET;
641
  }
642
  /* Return the flag status */
643
  return bitstatus;
644
}
645

    
646
/**
647
  * @brief  Clears the PWR's pending flags.
648
  * @param  PWR_FLAG: specifies the flag to clear.
649
  *          This parameter can be one of the following values:
650
  *            @arg PWR_FLAG_WU: Wake Up flag
651
  *            @arg PWR_FLAG_SB: StandBy flag
652
  * @retval None
653
  */
654
void PWR_ClearFlag(uint32_t PWR_FLAG)
655
{
656
  /* Check the parameters */
657
  assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG));
658
         
659
  PWR->CR |=  PWR_FLAG << 2;
660
}
661

    
662
/**
663
  * @}
664
  */
665

    
666
/**
667
  * @}
668
  */
669

    
670
/**
671
  * @}
672
  */
673

    
674
/**
675
  * @}
676
  */
677

    
678
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/